Xml XSLT根据子节点的出现情况转换子节点名称
这是我的要求,我需要编写一个XSLT,它将根据出现的情况转换节点名。请参见我的示例 XML显示:Xml XSLT根据子节点的出现情况转换子节点名称,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,这是我的要求,我需要编写一个XSLT,它将根据出现的情况转换节点名。请参见我的示例 XML显示: <Orders> <Order> <OrderNo>ABC</OrderNo> <ItemDetails> <Name>Shirt</Name> <Name>Socks</Name>
<Orders>
<Order>
<OrderNo>ABC</OrderNo>
<ItemDetails>
<Name>Shirt</Name>
<Name>Socks</Name>
<ItemPrice>30</ItemPrice>
<ItemPrice>40</ItemPrice>
</ItemDetails>
</Order>
</Orders>
基础知识
衬衫
袜子
30
40
需要XML
<Orders>
<Order>
<OrderNo>ABC</OrderNo>
<ItemDetails>
<Name1>Shirt</Name>
<Name2>Socks</Name>
<ItemPrice1>30</ItemPrice>
<ItemPrice2>40</ItemPrice>
</ItemDetails>
</Order>
</Orders>
基础知识
衬衫
袜子
30
40
检查名称和项目价格。像这样,我在一个订单xml中有100个订单这可以使用基于标识转换的样式表来复制大部分xml,而不做任何更改,只需调整要更改的小部分:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="ItemDetails/*">
<xsl:element name="{name()}{count(
preceding-sibling::*[name() = name(current())]) + 1}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在更一般的层面上,这是一种相当糟糕的XML格式选择——通常对表示相同类型数据的元素使用相同的名称,并通过嵌套而不是定位来表示不同元素之间的依赖关系,例如
<ItemDetails>
<Item>
<Name>Shirt</Name>
<Price>30</Price>
</Item>
<Item>
<Name>Socks</Name>
<Price>40</Price>
</Item>
</ItemDetails>
衬衫
30
袜子
40
谢谢伊恩·罗伯茨:Cna我们从0开始。我在努力,但我不喜欢这件衬衫Socks@saikri正如我在对这个问题的评论中所问的,您需要XSLT1.0还是2.0?这两个标签应该是互斥的。
<xsl:template match="@*|node()" name="ident">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="ItemDetails/*">
<xsl:choose>
<xsl:when test="preceding-sibling::*[name() = name(current())]">
<xsl:element name="{name()}{count(
preceding-sibling::*[name() = name(current())])}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:when>
<xsl:otherwise>
<!-- this is the first element with this name, so revert to the
identity behaviour -->
<xsl:call-template name="ident" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<ItemDetails>
<Item>
<Name>Shirt</Name>
<Price>30</Price>
</Item>
<Item>
<Name>Socks</Name>
<Price>40</Price>
</Item>
</ItemDetails>