这是我的示例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>
答案 0 :(得分: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>