2016-05-16 128 views
1

这里是我的示例XML,我想使用xslt将所有元素转换为属性。我是新来的XSLT和到目前为止,我已经解决了人的元素转换为属性:将所有元素转换为属性

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

但我有问题,CONCAT它转换小队元素属性在一起。

例如输入:

<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> 
相关问题