2017-08-22 6 views
0

XSLTを使用してタグの名前を変更するときに、XMLタグの値を保持する方法を知りたいと思います。以下は私のxml、xslt、そして望ましい結果です。私はこれを行う方法がわからないので、私は変数を使ってこれを試み、XLSTのwhenとotherwiseタグも選択しました。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> 
関連する問題