2016-09-12 3 views
0

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?

+0

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. –

+0

Sorry, falsch gedruckte, aktualisierte Version zu xslt-2.0 – senleft

Antwort

1

Hier ist ein XSLT 2.0 Stylesheet:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:param name="element_type" select="'folder'"/> 
    <xsl:param name="path" select="'root/sub2'"/> 
    <xsl:param name="old_value" select="'temp-'"/> 
    <xsl:param name="new_value" select="''"/> 

    <xsl:param name="path-tokens" as="xs:string*" select="tokenize($path, '/')"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[string-join(ancestor-or-self::*[position() le count($path-tokens)]/@name, '/') eq $path]//*[local-name() eq $element_type]/@name[contains(., $old_value)]"> 
     <xsl:attribute name="{name()}" select="replace(., $old_value, $new_value)"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Vielen Dank! – senleft

Verwandte Themen