XSLT 1.0 循环

XSLT 1.0 looping

我不确定如何使用一些计数逻辑从 for-each 切换到循环逻辑

这里是xml的小样本。序列号和折扣号的范围可能很大。我之前已经排序,所以 xml 的顺序是正确的。

<ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
    <ns2:RETAILSEQUENCENUMBER>1</ns2:RETAILSEQUENCENUMBER>
    <ns2:DISCOUNTSEQUENCENUMBER>1</ns2:DISCOUNTSEQUENCENUMBER>
    <ns2:DISCOUNTTYPECODE>ZD01</ns2:DISCOUNTTYPECODE>
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
<ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
    <ns2:DATAHEADERCOLUMN_SEGNAM>/POSDW/E1BPLINEITEMDISCOUNT002</ns2:DATAHEADERCOLUMN_SEGNAM>
    <ns2:RETAILSEQUENCENUMBER>1</ns2:RETAILSEQUENCENUMBER>
    <ns2:DISCOUNTSEQUENCENUMBER>2</ns2:DISCOUNTSEQUENCENUMBER>
    <ns2:DISCOUNTTYPECODE>Z407</ns2:DISCOUNTTYPECODE>
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
<ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
    <ns2:DATAHEADERCOLUMN_SEGNAM>/POSDW/E1BPLINEITEMDISCOUNT002</ns2:DATAHEADERCOLUMN_SEGNAM>
    <ns2:RETAILSEQUENCENUMBER>1</ns2:RETAILSEQUENCENUMBER>
    <ns2:DISCOUNTSEQUENCENUMBER>3</ns2:DISCOUNTSEQUENCENUMBER>
    <ns2:DISCOUNTTYPECODE>Z407</ns2:DISCOUNTTYPECODE>
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
    <ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
    <ns2:RETAILSEQUENCENUMBER>2</ns2:RETAILSEQUENCENUMBER>
    <ns2:DISCOUNTSEQUENCENUMBER>1</ns2:DISCOUNTSEQUENCENUMBER>
    <ns2:DISCOUNTTYPECODE>ZD01</ns2:DISCOUNTTYPECODE>
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
<ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
    <ns2:DATAHEADERCOLUMN_SEGNAM>/POSDW/E1BPLINEITEMDISCOUNT002</ns2:DATAHEADERCOLUMN_SEGNAM>
    <ns2:RETAILSEQUENCENUMBER>2</ns2:RETAILSEQUENCENUMBER>
    <ns2:DISCOUNTSEQUENCENUMBER>2</ns2:DISCOUNTSEQUENCENUMBER>
    <ns2:DISCOUNTTYPECODE>Z407</ns2:DISCOUNTTYPECODE>
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>

这是我的 XSLT

      <xsl:for-each select="ns0:idocData/ns2:_x002F_POSDW_x002F_E1POSTR_CREATEMULTIP001GRP">
        <xsl:for-each select="ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002">
          <ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
    <ns2:DATAHEADERCOLUMN_SEGNAM><xsl:value-of select="ns2:DATAHEADERCOLUMN_SEGNAM"/></ns2:DATAHEADERCOLUMN_SEGNAM>
    <ns2:RETAILSEQUENCENUMBER><xsl:value-of select="ns2:RETAILSEQUENCENUMBER"/></ns2:RETAILSEQUENCENUMBER>
    <ns2:DISCOUNTSEQUENCENUMBER><xsl:value-of select="ns2:DISCOUNTSEQUENCENUMBER"/></ns2:DISCOUNTSEQUENCENUMBER>
    <ns2:DISCOUNTTYPECODE><xsl:value-of select="ns2:DISCOUNTTYPECODE"/></ns2:DISCOUNTTYPECODE>
          </ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002>
        </xsl:for-each>
      </xsl:for-each>

我的要求是遍历 xml 并且发现 ns2:DISCOUNTTYPECODE 是 ZD01 的地方使 ZD11。如果在同一个 ns2:RETAILSEQUENCENUMBER 中找到另一个 ZD01,则使下一个 DISCOUNTTYPECODE = ZD12,然后是 ZD13 等。仅在 ZD01 记录上。

一旦 XML 落入下一个 RETAILSEQUENCENUMBER,则逻辑需要重新开始,以便 ZD01 变为 ZD11。

我建议编写另一个转换来预处理数据以使用上述 dpawson 站点中的一种技术对其进行排序和分组,这将使确定折扣类型变得容易得多。

数据分组和排序后,此转换将只关注折扣类型等的任何更改。然后您可以查看以前的 ZD01 兄弟姐妹有多少,并根据数量推断新的折扣类型以前的兄弟姐妹

  • 0 个先前的 ZD01 元素 = ZD11
  • 1 个上一个 ZD01 元素 = ZD12
  • 等等

前面的兄弟也可以用来根据不同的零售编号值来确定是否需要重新编号。