在 xslt 的循环中重复位置

Repeat position within a loop in xslt

我有两个嵌套循环。第一个循环正在获取不同的值并在第二个循环中进行比较。在第二个循环中,我给出 position() 并且它以 1,2,3 的顺序出现,但我希望它在第一次迭代中显示为 1,1,1,在第二次迭代中显示为 2,2,2,在第二次迭代中显示为 3,3,3在第三次迭代中等等。

XML:

<root>
    <Items>
        <Item>
          <ItemCode>12345</ItemCode>
          <ItemColor>Red</ItemColor>
          <Weight>1Kg</Weight>
        </Item>


        <Item>
          <ItemCode>19087</ItemCode>
          <ItemColor>Blue</ItemColor>
          <Weight>1Kg</Weight>
        </Item>
  
    </Items>

<Items>
       
        <Item>
          <ItemCode>12345</ItemCode>
          <ItemColor>Yellow</ItemColor>
          <Weight>1Kg</Weight>
        </Item>

        <Item>
          <ItemCode>19087</ItemCode>
          <ItemColor>Green</ItemColor>
          <Weight>1Kg</Weight>
        </Item>
    
    </Items>
</root>

所需输出:

  12345
  1.Red
  1.Yellow
  
  19087
  2.Blue
  2.Green

(Or)
  1.12345
    Red
    Yellow
  
  2.19087
    Blue
    Green

代码:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="check" match="Items" use="ItemCode" />

<xsl:template match="root/Items">
     <xsl:for-each select="Item[count(. | key('check', ItemCode)[1]) = 1]">
             <xsl:value-of select="ItemCode"/>
        <xsl:for-each select="key('check', ItemCode)"> 
               
               <xsl:value-of select="position()"/>
               <xsl:value-of select="ItemColor"/>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

我正在使用 xslt-1.0 感谢您的帮助。谢谢!

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>

<xsl:key name="item-by-code" match="Item" use="ItemCode"/>

<xsl:template match="/root">
    <xsl:for-each select="Items/Item[count(. | key('item-by-code', ItemCode)[1]) = 1]">
        <xsl:value-of select="position()"/>
        <xsl:text>.</xsl:text>
        <xsl:value-of select="ItemCode"/>
        <xsl:for-each select="key('item-by-code', ItemCode)"> 
            <xsl:text>&#10;  </xsl:text>
            <xsl:value-of select="ItemColor"/>
        </xsl:for-each>
        <xsl:text>&#10;&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

当应用你的输入示例时,将 return:

结果

1.12345
  Red
  Yellow

2.19087
  Blue
  Green

或者,您可以这样做:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>

<xsl:key name="item-by-code" match="Item" use="ItemCode"/>

<xsl:template match="/root">
    <xsl:for-each select="Items/Item[count(. | key('item-by-code', ItemCode)[1]) = 1]">
        <xsl:variable name="i" select="position()" />
        <xsl:value-of select="ItemCode"/>
        <xsl:text>&#10;</xsl:text>
        <xsl:for-each select="key('item-by-code', ItemCode)"> 
            <xsl:value-of select="$i"/>
            <xsl:text>.</xsl:text>
            <xsl:value-of select="ItemColor"/>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

获得:

12345
1.Red
1.Yellow

19087
2.Blue
2.Green