Announcement

Collapse
No announcement yet.

XML-Elemente nach bestimmten Elementen ändern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML-Elemente nach bestimmten Elementen ändern

    Hallo,

    in einem gelieferten XML gibt es die Kombination von verschiedenen XML-Elementen, die mit bestimmten Zeichenformatierungen wiedergeben werden sollen (z.B. <b> für bold, <i> für italic, <sup> für hochgestellt, <sub> für tiefgestellt ...).

    Es gibt auch Kombination/Verschachtelungen von mehreren der genannten XML-Elemente wie z.B. <b>Beispieltext<sup>23, 24</sup></b> oder <b><i>Beispieltext1</i> Beispieltext2</b>.

    Das XML wird in InDesign importiert. InDesign kann beim Zuweisen von XML-Elementen zu Absatz- bzw. Zeichenformaten immer nur ein Element berücksichtigen. D.h., dass in meinem obigen Beispiel "<b>Beispieltext<sup>23, 24</sup></b>" nur "Beispieltext" in "bold" wiedergegeben wird; die hochgestellten Ziffern "23, 24" sind zwar hochgestellt, aber nicht in Bold.

    Jetzt suche ich nach einer XSLT-Lösung, die mir vor dem XML-Import nach InDesign nach den oben genannten 4 XML-Elementen sucht und wenn nach einem dieser Elemente ein weiteres der genannten folgt (und nur dann) soll das folgende einen neuen Namen erhalten z.B. <b_i> für "Bold Italic" oder <b_sup> für "Bold + Hochgestellt". Ist etwas schwierig zu erklären, aber um bei meinem obigen Beispiel zu bleiben müsste dass nach der XSLT so aussehen:
    <b>Beispieltext<b_sup>23, 24</b_sup></b> oder <b><b_i>Beispieltext1</b_i> Beispieltext2</b>.

    Somit kann ich mir für jede mögliche Kombination aus den 4 Elementen ein eigenes Zeichenformat in InDesign anlegen und dieses dem jeweiligen XML-Element im Layout zuweisen.

    Hat mir jemand einen Tipp?

  • #2
    Ansatz für b und die speziellen Kindelemente (also für alle Elemente, deren parent-Element b ist):
    Code:
    <xsl:template match="b">
     <b><xsl:apply-templates/></b>
    </xsl:template>
    
    <xsl:template match="*[parent::b]">
      <xsl:element name="b_{local-name()}">
        <xsl:value-of select="."/>
      </xsl:element>
    </xsl:template>
    In dieser Analogie lassen sich auch die anderen Kombinationen erfassen, also etwa:
    Code:
    <xsl:template match="sup">
     <sup><xsl:apply-templates/></sup>
    </xsl:template>
    
    <xsl:template match="*[parent::sup]">
      <xsl:element name="sup_{local-name()}">
        <xsl:value-of select="."/>
      </xsl:element>
    </xsl:template>

    Comment


    • #3
      Hallo Thomas,

      vielen Dank für Deine Hilfe. Das funktioniert soweit schon ganz gut.

      Ich hätte da noch eine "Anfängerfrage":

      Mit den beiden Codes werden die XML-Elemente wie gewünscht geändert, wie kann ich aber den kompletten Wurzelknoten (mit allen anderen XML-Elementen) mit in das Output-XML bekommen?

      Ich hab es damit versucht und habe Deinen Code hinten angehängt (nach "</xsl:template"), aber das geht irgendwie nicht:

      Code:
      <?xml version="1.0"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml" indent="yes"/>
      <xsl:template match="/">
      <xsl:copy-of select="."/>
      </xsl:template>

      Comment


      • #4
        Verwende dafür dieses Identity-Template:
        Code:
        <xsl:template match="@* | node()">
          <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
          </xsl:copy>
        </xsl:template>

        Comment


        • #5
          Hallo Thomas,

          Wow, Klasse!

          Vielen Dank für Deine Hilfe!

          Comment

          Working...
          X