Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT根据子节点的出现情况转换子节点名称_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Xml XSLT根据子节点的出现情况转换子节点名称

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>

这是我的要求,我需要编写一个XSLT,它将根据出现的情况转换节点名。请参见我的示例

XML显示:

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