通过xslt重新排列xml节点

时间:2017-07-23 07:29:27

标签: xml xslt

您好我是初学者使用XSLT。我有一个具有不同属性的XMl,我的目标是创建一个具有各自属性的订单模式的新XML。为此我使用下面的XSLT

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="/">
                <channel>
                    <title>Test Data</title>
                    <link>http://www.google.com</link>
                    <xsl:apply-templates select="products/product" />

                </channel>
        </xsl:template>

        <xsl:template match="products/product">
            <item>
                <xsl:apply-templates select="@*"/>
            </item>
        </xsl:template>

        <xsl:template match="products/product/@*">
            <xsl:copy-of select="."/>
        </xsl:template>

        <xsl:template match="products/product/Parent_identifier | products/product/Unique_ID | products/product/EAN> 
            <xsl:element name="{local-name()}">
                <xsl:apply-templates select="node()|@*" />
            </xsl:element>
        </xsl:template>

    </xsl:stylesheet>

示例XML如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<products>
  <product>
    <EAN>9999999999975</EAN>
    <Parent_identifier>BP_100001766</Parent_identifier>
    <Unique_ID>999999975</Unique_ID>
  </product>
  <product>
    <EAN>99000009999975</EAN>
    <Parent_identifier>BP_10066</Parent_identifier>
    <Unique_ID>999000975</Unique_ID>
  </product>
  <product>
    <EAN>99111119999975</EAN>
    <Parent_identifier>BP_10222066</Parent_identifier>
    <Unique_ID>99911110975</Unique_ID>
  </product>
</products>

我的预期输出XML是:

<?xml version='1.0' encoding='UTF-8'?>
<products>
  <product>
    <Parent_identifier>BP_100001766</Parent_identifier>
    <Unique_ID>999999975</Unique_ID>
    <EAN>9999999999975</EAN>
  </product>
  <product>
    <Parent_identifier>BP_10066</Parent_identifier>
    <Unique_ID>999000975</Unique_ID>
    <EAN>99000009999975</EAN>
  </product>
  <product>
    <Parent_identifier>BP_10222066</Parent_identifier>
    <Unique_ID>99911110975</Unique_ID>
    <EAN>99111119999975</EAN>
  </product>
</products>

任何人都可以帮我找出错误并获得预期的输出

1 个答案:

答案 0 :(得分:3)

此XML中没有属性。您的示例输入/输出显示您正在尝试更改元素的顺序。因此,您在样式表中对@*的大多数使用都应更改为*

要以与输入不同的顺序输出元素,请在apply-templates中明确选择它们:

XSLT 2.0 / 3.0

<xsl:apply-templates select="Parent_identifier, Unique_ID, EAN"/>

XSLT 1.0

<xsl:apply-templates select="Parent_identifier"/>
<xsl:apply-templates select="Unique_ID"/>
<xsl:apply-templates select="EAN"/>