Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 在XSLT中使用控制中断逻辑_Variables_Xslt - Fatal编程技术网

Variables 在XSLT中使用控制中断逻辑

Variables 在XSLT中使用控制中断逻辑,variables,xslt,Variables,Xslt,如果我有一个XSLT,我需要修改它以包含控制中断逻辑,并假设我只会使用元素来执行此操作,直到我发现w3schools网站上表达的此限制: 注意:一旦设置了变量的值,就不能更改或修改该值 那么,什么是确定键值何时更改的合适方法呢?以下是我想做的事情的要点: <xsl:variable name="ctlBreakVar"/> <xsl:for-each select="payment"> <!-- Compare ctlBreakVar variable ag

如果我有一个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>

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

for each循环中没有中断,因为您正在指示处理器访问for each select表达式中寻址的每个项。如果你不想去拜访每一个人,那就去拜访你想要的人吧

由于您希望每个组的文档顺序中第一个具有公共值,因此请使用多种分组方法之一。在XSLT2.0中就是这样


有很多这样的例子。

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

for each循环中没有中断,因为您正在指示处理器访问for each select表达式中寻址的每个项。如果你不想去拜访每一个人,那就去拜访你想要的人吧

由于您希望每个组的文档顺序中第一个具有公共值,因此请使用多种分组方法之一。在XSLT2.0中就是这样


有很多这样的例子。

正确,在XSLT中可能不会修改变量。不要考虑设置一个变量来反映上次看到的referenceNumber。而是考虑可以应用于输入文档的测试。对于每个付款,您可以测试早期付款是否具有相同的参考编号。例如

此XSLT:


正确,在XSLT中不能修改变量。不要考虑设置一个变量来反映上次看到的referenceNumber。而是考虑可以应用于输入文档的测试。对于每个付款,您可以测试早期付款是否具有相同的参考编号。例如

此XSLT:


此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>

此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的示例吗?我真的不认为这有什么帮助,因为这是一个一般性的问题,但这里有一个片段:150001770.55 150001880.66 1500024500.00我只需要在每次遇到新的referenceNumber值时做一些不同的事情。谢谢。输入XML的示例通常对XSLT问题很有帮助,因为它们有助于消除歧义。例如,在这种情况下,键值是什么意思?referenceNumber是元素还是属性?此外,示例还为人们提供了一些可以测试其解决方案的内容。您能提供一个输入XML的示例吗?我真的看不出这有什么帮助,因为这是一个非常普遍的问题,但这里有一个片段:150001770.55 150001880.66 1500024500.00每次遇到新的referenceNumber值时,我只需要做一些不同的事情。谢谢。输入XML的示例通常对XSLT问题很有帮助,因为它们有助于消除歧义。例如,在这种情况下,键值是什么意思?referenceNumber是元素还是属性?此外,示例还为人们提供了一些可以测试其解决方案的东西。此解决方案与示例配合使用,如果referenceNumber元素总是合理地分组在一起,则此解决方案是很好的。但是,如果referenceNumber元素的顺序为150001、150001、150002、150001,那么最后一个元素将不会触发不同的引用号消息,因为它在前面已经出现过。我真的不想听起来很挑剔。事实上,除了对你的答案发表评论外,我还对它投了更高的票,因为我相信它可能适合OP的目的。然而,据我所知,之前的付款是指紧接着这次付款之前的付款,我想指出这一点,以防万一这一点很重要。我只是想澄清一下,在我的例子中,假设匹配的引用编号将始终是连续的,而不是分散在整个XML输入文件中。本的建议很简单,对我很有效。然而,我确实了解到我最初尝试的调整。。。无法工作,因为第一条记录不满足作为不同引用编号的条件。因此,我必须像他那样首先测试等式,如果为true,则什么也不做,并将我的其余代码放在否则的块中
似乎合理地将Y组合在一起。但是,如果referenceNumber元素的顺序为150001、150001、150002、150001,那么最后一个元素将不会触发不同的引用号消息,因为它在前面已经出现过。我真的不想听起来很挑剔。事实上,除了对你的答案发表评论外,我还对它投了更高的票,因为我相信它可能适合OP的目的。然而,据我所知,之前的付款是指紧接着这次付款之前的付款,我想指出这一点,以防万一这一点很重要。我只是想澄清一下,在我的例子中,假设匹配的引用编号将始终是连续的,而不是分散在整个XML输入文件中。本的建议很简单,对我很有效。然而,我确实了解到我最初尝试的调整。。。无法工作,因为第一条记录不满足作为不同引用编号的条件。因此,我必须像他一样首先测试等式,如果为真,则什么也不做,并将其余代码放在否则的块中。我明白你的意思,因为我使用了相同的字符串输出。我这样做只是为了比较两个样式表。我道歉。但是,我不同意我只是做了一些小的改动——我们解决方案的结构与使用xsl:choose与使用我的模板匹配完全不同。我明白你的观点,因为我使用了相同的字符串输出。我这样做只是为了比较两个样式表。我道歉。但是,我不同意我只是做了一些小的改动——我们解决方案的结构与您使用xsl:choose和我的模板匹配完全不同。
      Different reference number.

      Same reference number.

      Different reference number.
<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>
<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.