您好我是初学者使用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>
任何人都可以帮我找出错误并获得预期的输出
答案 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"/>