2016-05-16 5 views
1

ここで私のサンプルXMLですが、xsltを使用してすべての要素を属性に変換したいと考えています。私は、XSLTに新しいですし、これまでのところ、私は属性に、人の要素を変換するためのソリューションを持っている:すべての要素をatribuitesに変換する

<xsl:template match="person"> 
    <person> 
     <xsl:for-each select="*"> 
      <xsl:attribute name="{name()}"> 
       <xsl:value-of select="text()"/> 
      </xsl:attribute> 
     </xsl:for-each> 
    </person> 
</xsl:template> 

しかし、私は、属性にチームの要素を変換するとともに、連結での問題、それを持っています。

例入力:

<squad> 
    <competitionId>12345asdf</competitionId> 
    <contestantId>1234avhj</contestantId> 
    <person> 
     <name>Abc</firstName> 
     <lastName>Fgh</lastName> 
     <middleName></middleName> 
     <id>dfghfgdhjgfhjk3425dz</id> 
    </person> 
    <person> 
     <firstName>Dcb</firstName> 
     <lastName>Has</lastName> 
     <middleName></middleName> 
     <id>dfghfgdhjgfhjk1234dz</id> 
    </person> 
</squad> 

出力例:代わりに特定の要素にマッチするテンプレートを持っていることの

<squad contestantId="1234avhj" competitionId="12345asdf"> 
     <person id="dfghfgdhjgfhjk3425dz" firstName="Abc" middleName="" lastName="Fgh"/> 
     <person id="dfghfgdhjgfhjk1234dz" firstName="Dcb" middleName="" lastName="Has"/> 
</squad> 

答えて

1

、より汎用的なテンプレートを持っていますが、あなたが持っていることを確認唯一の子要素を加える必要があります子要素自体は属性に変換されません。

すると、このテンプレートの代わりに

<xsl:template match="*"> 
    <xsl:copy> 
     <xsl:for-each select="*[not(*)]"> 
      <xsl:attribute name="{name()}"> 
       <xsl:value-of select="text()"/> 
      </xsl:attribute> 
     </xsl:for-each> 
     <xsl:apply-templates select="*[*]" /> 
    </xsl:copy> 
</xsl:template> 
をお試しください
関連する問題