1

如果我需要修改一个 XSLT 以包含控制中断逻辑,并假设我只会使用该元素来执行此操作,直到我发现 w3schools 网站上表达的这个限制:

注意:一旦设置了变量的值,就不能更改或修改该值!

那么什么是识别键值何时更改的合适方法呢?这是我正在尝试做的事情的本质:

<xsl:variable name="ctlBreakVar"/>

<xsl:for-each select="payment">

  <!-- Compare ctlBreakVar variable against referenceNumber value in payment record
       and if changed from previous payment, output something
  -->

</xsl:for-each>
4

3 回答 3

3

这个 XSLT 1.0 样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="/payments">
    <xsl:apply-templates select="payment"/>
  </xsl:template>

  <!-- Matches payment elements with the same reference number as the first preceding sibling payment element. -->
  <xsl:template match="payment[preceding-sibling::payment[1]/referenceNumber = current()/referenceNumber]">
    Same reference number.
  </xsl:template>

  <!-- All other payment elements, including the very first one. -->
  <xsl:template match="payment">
    Different reference number.
  </xsl:template>

</xsl:stylesheet>

当应用于您的示例输入 XML 时:

<payments>
  <payment>
    <referenceNumber>150001</referenceNumber>
    <amount>770.55</amount>
  </payment>
  <payment>
    <referenceNumber>150001</referenceNumber>
    <amount>880.66</amount>
  </payment>
  <payment>
    <referenceNumber>150002</referenceNumber>
    <amount>4500.00</amount>
  </payment>
</payments>

生成以下输出 XML:

    Different reference number.

    Same reference number.

    Different reference number.
于 2013-10-02T19:26:02.310 回答
2

正确,变量不能在 XSLT 中修改。不要想着设置一个变量来反映上次看到的情况referenceNumber。而是考虑可以应用于输入文档的测试。对于你的每一个payments,你可以测试之前是否payment有相同的referenceNumber。例如...

这个 XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/payments">
    <xsl:for-each select="payment">
      <xsl:variable name="curReferenceNumber" select="referenceNumber"/>
      <xsl:choose>
        <xsl:when test="preceding-sibling::payment[referenceNumber = $curReferenceNumber]">
          Same reference number.
        </xsl:when>
        <xsl:otherwise>
          Different reference number.
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

对于此输入 XML:

<payments>
  <payment>
    <referenceNumber>150001</referenceNumber>
    <amount>770.55</amount>
  </payment>
  <payment>
    <referenceNumber>150001</referenceNumber>
    <amount>880.66</amount>
  </payment>
  <payment>
    <referenceNumber>150002</referenceNumber>
    <amount>4500.00</amount>
  </payment>
</payments>

将产生这个输出:

      Different reference number.

      Same reference number.

      Different reference number.
于 2013-10-02T17:14:02.100 回答
1

XSLT 中的适当解决方案是将您的付款视为按共同值分组的总体。然后 XSLT 为您提供所需的一切,而不必担心更改变量值。

for-each 循环中没有“中断”,因为您指示处理器访问 for-each 选择表达式中处理的每个项目。如果您不想访问每个人,那么只需解决您想要的人。

由于您想要具有公共值的每个组的文档顺序中的第一个,因此请使用许多分组方法中的一种。在 XSLT 2.0 中是<xsl:for-each-group>.

这方面的例子很多。

于 2013-10-02T17:13:03.993 回答