Ich muss zwei Attribute eines Knotens basierend auf dem Wert von einem von ihnen ändern. Wenn @ dc = "R" und @ rt = "UM", dann muss ich @dc zu "NF" ändern und das @rt-Attribut entfernen. Hier ist, wie ich versucht habe, es zu tun, aber das löscht alle Unterelemente des Dokuments.Ändern von zwei Attributen mit XSLT
Beispieldokument:
<?xml version="1.0" encoding="UTF-8"?>
<ID dc="R" rt="UM" other="attr">
<foo>bar</foo>
</ID>
Sheet:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[@dc = 'R' and @rt = 'UM']">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="nf"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@dc" mode="nf">
<xsl:attribute name="dc">
<xsl:text>NF</xsl:text>
</xsl:attribute>
</xsl:template>
<xsl:template match="@rt" mode="nf"/>
<xsl:template match="@*|node()" mode="nf">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Ergebnis:
<?xml version="1.0" encoding="UTF-8"?>
<ID dc="NF" other="attr"/>
Der <foo>
-Tag und sein Text verschwunden sind. Gibt es einen besseren Weg? Fehle ich etwas?
Ihre zweite Vorlage hat 'node' statt' Knoten() '. Und Sie sollten den Modus wahrscheinlich auch in der letzten Vorlage zu "xsl: apply-templates" hinzufügen. Obwohl ich nicht denke, dass Sie den Modus überhaupt verwenden müssen. –