ich xsl Vorlage müssen, dass für bestimmte ‚ELEMENT_TYPE‘ unter Angabe ‚Pfad‘ mit dem Attribut ‚name‘ Wert angepasst ‚old_value‘ wird ‚old_value‘ mit ‚new_value‘ändern Attributwert unter angegebenen Pfad
ersetze ich erstellt xsl template mit korrekter Handhabung für Parameter 'element_type', 'old_value', 'new_value'. Ich stapelte mich mit dem Parameter 'Pfad'. Unten finden Eingang xml
<?xml version="1.0" encoding="utf-8"?>
<storage name="hdd1">
<folder name="root">
<folder name="sub1">
<folder name="sub1-sub">
<file name="temp-docs"/>
<folder name="temp-docs"/>
<folder name="temp-pictures"/>
</folder>
</folder>
<folder name="sub2">
<folder name="temp-docs">
<folder name="inner-temp-bar"/>
</folder>
<folder name="temp-pictures"/>
</folder>
</folder>
<folder name="temp-docs"/>
<folder name="temp-pictures"/>
</storage>
Das nächste ist XSL entwickelt:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="element_type"/>
<xsl:param name="path"/>
<xsl:param name="old_value"/>
<xsl:param name="new_value"/>
<xsl:template match="/ | * | @*">
<xsl:copy>
<xsl:apply-templates select="* | @* | text()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:choose>
<xsl:when test="contains(., $old_value)
and local-name() = 'name'
and name(..) = $element_type
and ancestor::*[2]/@name = $path">
<xsl:attribute name="name">
<xsl:value-of select="substring-before(., $old_value)"/>
<xsl:value-of select="$new_value"/>
<xsl:value-of select="substring-after(., $old_value)"/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="* | @* | text()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Eingangsparameter:
'element_type' = 'folder'
'old_value' = 'temp-'
'new_value' = ''
'path'= 'sub2'
Die obige XSL-Anwendung über XML-Ergebnis (umbenannt alle ‚-Ordner 'element, but not' Ordner 'Element mit Name = "inner-temp-bar):
<?xml version="1.0" encoding="UTF-8"?>
<storage name="hdd1">
<folder name="root">
<folder name="sub1">
<folder name="sub1-sub">
<file name="temp-docs"/>
<folder name="temp-docs"/>
<folder name="temp-pictures"/>
</folder>
</folder>
<folder name="sub2">
<folder name="docs">
<folder name="inner-temp-docs"/>
</folder>
<folder name="pictures"/>
</folder>
</folder>
<folder name="temp-docs"/>
<folder name="temp-pictures"/>
</storage>
Das Ziel ist alle Ordner und Unterordner unter angegebenen Pfad umbenennen, z. B .:
- 'Pfad' = 'root/sub2' wird alle 'Ordner' Elemente in 'sub2' Element umbenennen;
- 'Pfad' = 'Wurzel' wird alle 'Ordner' Elemente in 'Sub1' und 'Sub2' Element umbenennen.
Wie muss ich mit "Pfad" -Parameter umgehen, um das obige Ziel zu erreichen?
Ihr Sheet hat 'version = "1.0"', aber Ihre Frage ist, wie xslt-2.0 markiert. Bitte klären Sie, ob Sie einen XSLT 2.0-Prozessor verwenden, der das Codieren sicher macht. –
Sorry, falsch gedruckte, aktualisierte Version zu xslt-2.0 – senleft