2017-08-22 63 views
0

我想知道如何在使用XSLT重命名標記時保留XML標記值。以下是我的xml,xslt和期望的結果。我不知道如何做到這一點,所以我試圖使用變量,並選擇何時和否則標記在XLST。如何在使用XSLT重命名標記時保留XML標記值

的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<x> 
    <y> 
     <z value="john" designation="manager"> 
      <z value="mike" designation="associate"></z> 
      <z value="dave" designation="associate"></z> 
     </z> 
    </y> 
</x> 

的XSLT:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="var"> 
name="manager value=\"sam\"" 
</xsl:variable> 

<xsl:template match="x"> 
    <employees> 
     <xsl:apply-templates /> 
    </employees> 
</xsl:template> 

<xsl:template match="y"> 
    <employee> 
     <xsl:apply-templates /> 
    </employee> 
</xsl:template> 

<xsl:template match="z"> 
<xsl:choose> 
    <xsl:when test="sam"> 
    <xsl:element name="{$var}"> 
    </xsl:element> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:element name="{@designation}"> 
     <xsl:value-of select="@value"/> 
     <xsl:apply-templates /> 
    </xsl:element> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

所需的輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<employees> 
    <employee> 
     <manager value="john"> 
      <associate>mike</associate> 
      <associate>dave</associate> 
     </manager> 
    </employee> 
</employees> 
+0

的例子不明確 - 請用文字解釋所需的邏輯。 –

回答

0

這應該工作:

<?xml version="1.0" encoding="UTF-8"?> 
<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:template match="x"> 
     <employees> 
      <xsl:apply-templates/> 
     </employees> 
    </xsl:template> 

    <xsl:template match="y"> 
     <employee> 
      <xsl:apply-templates/> 
     </employee> 
    </xsl:template> 

    <xsl:template match="*[contains(@designation, 'manager')]"> 
     <manager> 
      <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute> 
      <xsl:apply-templates/> 
     </manager> 
    </xsl:template> 

    <xsl:template match="*[contains(@designation, 'associate')]"> 
     <associate> 
      <xsl:value-of select="@value"/> 
     </associate> 
    </xsl:template> 

</xsl:stylesheet>