Announcement

Collapse
No announcement yet.

Bestehende xml Datei kopieren und um ein Attribut erweitern

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

  • Bestehende xml Datei kopieren und um ein Attribut erweitern

    Hallo zusammen,

    ich habe folgendes Problem:

    Ausgangspunkt ist eine Datenstruktur wie diese
    Code:
    <tests>
      <test>
        <level>info</level>
      </test>
      <test>
        <level>info</level>
      </test>
    </tests>
    Diese wird mir fertig übergeben, ich kann sie also nicht ändern. In einem ersten Schritt schreibe ich diese per
    Code:
    <xsl:sequence...>
    in eine Datei.

    Der nächste Schritt ist diese Datei mit einem anderen Stylesheet wieder einzulesen und weiter zu verarbeiten (wie, ist für das Problem unerheblich). Allerdings benötige ich die Datei nun in folgender Form:

    Code:
    <tests>
    <test>
      <level num="1">info</level>
    </test>
    <test>
      <level num="1">info</level>
    </test>
    </tests>
    d.h. ich benötige ein zusätzliches Attribut. Wie kann ich das bewerkstelligen? Ich weiß, dass es
    Code:
    <xsl:attribute>
    gibt, aber meine bisherigen Versuche scheiterten das in dieser Situation an zu wenden. Wäre es möglich mit einem einfachen Stylesheet, dass mir die Datei komplett kopiert zu arbeiten? Das müsste dann zwei Templates haben. Eines, das mir alle Knoten bis auf "level" kopiert und eines, das genau diesen Level-Knoten erst um ein Attribut erweitert und dann kopiert. Leider weiß ich aber nicht wie ich das realisieren kann.
    Besser wäre natürlich, wenn ich kein zusätzliches Stylesheet brauchen würde, d.h. wenn ich diese Anpassung vornehmen könnte, bevor ich per "sequence" den Baum im ersten Schritt einfüge.

    Wäre cool, wenn ihr euch meinem Problem annehmen könntet.

    Gruß

    Moe

  • #2
    Da xsl:sequence auf XSLT 2.0 hindeutet, bietet sich dieses Vorgehen an (Identitäts-Templates + Neuschreiben von level):

    Code:
    <xsl:template match="element()">
      <xsl:copy>
        <xsl:apply-templates select="@*,node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="attribute() | text() | comment() | processing-instruction()">
      <xsl:copy/>
    </xsl:template>
    
    <xsl:template match="level">
      <xsl:copy>
        <xsl:attribute name="num">
          <xsl:text>1</xsl:text>
        </xsl:attribute>   
        <xsl:apply-templates select="@*,node()"/>
      </xsl:copy>
    </xsl:template>

    Comment


    • #3
      Als kleine Ergänzung: wenn XSLT 2.0 benutzt werden kann, dann ist
      Code:
      <xsl:attribute name="num" select="1"/>
      kürzer als
      Code:
      <xsl:attribute name="num">
        <xsl:text>1</xsl:text>
      </xsl:attribute>

      Comment


      • #4
        Hi,

        danke für eure Antworten. Genau darauf wollte ich hinaus!

        Gruß

        Moe

        Comment

        Working...
        X