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かどうかをテストできます。例えば...paymentreferenceNumber

この 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 に答える