【问题标题】:XSLT 1.0 loopingXSLT 1.0 循环
【发布时间】:2017-01-10 14:34:49
【问题描述】:

我不确定如何使用一些计数逻辑从 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。

【问题讨论】:

标签: xslt-1.0 xslt-grouping


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢拉尔斯/马特。我不得不引入另一个级别的预处理,这是我真的不想做的事情,因为每天处理的文件数量以及这对处理速度的担忧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多