将所有元素转换为属性

时间:2016-05-16 09:10:45

标签: xml xslt

这是我的示例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 个答案:

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