XSLT 1.0循环

时间:2017-01-10 14:34:50

标签: xslt-1.0 xslt-grouping

我不确定如何使用一些计数逻辑从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,则在ZD01记录上创建下一个DISCOUNTTYPECODE = ZD12,然后是ZD13等。

一旦XML落入下一个RETAILSEQUENCENUMBER,逻辑就需要再次启动,以便ZD01变为ZD11。

1 个答案:

答案 0 :(得分:0)

我建议编写另一个转换器来预处理数据,使用上面提到的dpawson网站中的一种技术对其进行排序和分组,这样可以更轻松地确定折扣类型。

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

  • 0之前的ZD01元素= ZD11
  • 1以前的ZD01元素= ZD12
  • 等。

之前的兄弟姐妹也可用于确定重新编号是否需要根据不同的零售数值重新开始。