使用XSLT将属性转换为子元素

时间:2013-09-23 12:19:44

标签: xml xslt

我正在尝试将属性转换为子元素,即转为以下内容:

<employees companyid="101">
    <record>
        <id>1</id>
        <name>pradeep</name>
        <designation>softeng</designation>
    </record>
    <record>
        <id>2</id>
        <name>som</name>
        <designation>softeng</designation>
    </record>
    <record>
        <id>3</id>
        <name>Javed</name>
        <designation>softeng</designation>
    </record>
</employees>

我想以这种方式改造

<employees>
    <record>

        <id>1</id>
        <name>pradeep</name>
        <designation>softeng</designation>
    </record>
    <record>
        <id>2</id>
        <name>som</name>
        <designation>softeng</designation>
    </record>
    <record>
        <id>3</id>
        <name>Javed</name>
        <designation>softeng</designation>
    </record>
</employees>

它不起作用。有什么建议?

2 个答案:

答案 0 :(得分:0)

我希望您在每个<companyid>级别都需要<record>元素。您可以使用以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="record">
        <xsl:copy>
            <companyid><xsl:value-of select="ancestor::employees/@companyid"/></companyid>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

如果您只想让它出现在第一个<record>元素上,您可以将<xsl:template match="record">更改为<xsl:template match="record[1]">

答案 1 :(得分:0)

<?xml version="1.0" encoding="UTF-8"?>    
<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:template match="/">
        <employees>
            <xsl:copy-of select="employees/*"/> 
        </employees>
    </xsl:template>
</xsl:stylesheet>

假设您的输出正确并且您只想删除companyid属性。