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
If statement XSLT2.0:通过匹配一个子节点并比较另一个子节点来提取XML节点_If Statement_Xslt_Foreach_Xslt 2.0 - Fatal编程技术网

If statement XSLT2.0:通过匹配一个子节点并比较另一个子节点来提取XML节点

If statement XSLT2.0:通过匹配一个子节点并比较另一个子节点来提取XML节点,if-statement,xslt,foreach,xslt-2.0,If Statement,Xslt,Foreach,Xslt 2.0,我输入的XML如下所示: <parent> <payment> <id>123456</id> <type>CANCELLED</type> <date>2020-12-03</date> <amount>100</amount> </payment> <payment&g

我输入的XML如下所示:

<parent>
    <payment>
        <id>123456</id>
        <type>CANCELLED</type>
        <date>2020-12-03</date>
        <amount>100</amount>
    </payment>
    <payment>
        <id>234567</id>
        <type>FORCE</type>
        <date>2020-12-01</date>
        <amount>200</amount>
    </payment>
    <payment>
        <id>345678</id>
        <type>CANCELLED</type>
        <date>2020-12-01</date>
        <amount>300</amount>
    </payment>
    <payment>
        <id>456789</id>
        <type>FORCE</type>
        <date>2020-12-01</date>
        <amount>400</amount>
    </payment>
    <payment>
        <id>456788</id>
        <type>CANCELLED</type>
        <date>2020-12-01</date>
        <amount>500</amount>
    </payment>
</parent>

123456
取消
2020-12-03
100
234567
强迫
2020-12-01
200
345678
取消
2020-12-01
300
456789
强迫
2020-12-01
400
456788
取消
2020-12-01
500
现在,我们需要类型为“已取消”且棘手条件在这些已取消付款中的节点,如果日期相等,则我们需要选择id最高的节点。因此,在上面的示例输入中,只应选择第一个和第五个节点。第一个节点的日期与任何其他节点都不匹配,因此它被选中。虽然第5个节点的日期与第3个节点匹配,但选择了第5个节点,因为它具有更高的id

为了实现这一点,我试着写下XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:variable name="input" select="parent"/>
    <xsl:template match="/">
        <xsl:for-each select="parent/payment[type='CANCELLED']">
            <xsl:choose>
                <xsl:when test="date = $input/payment[type='CANCELLED']/date">
                    <xsl:message>
                        <xsl:value-of select="amount"/>
                    </xsl:message>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="amount"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

对于每个都是必需的,因为在实际示例中,我们提取了一些值,所以我们需要调整每个循环条件或在其中写入if条件。我试图用整个输入xml声明变量输入,并将每次迭代中选择的节点与输入节点进行比较,但随后它也与self匹配。我走的方向对吗?请导游


提前感谢。

要识别具有相同
日期的
付款
请使用分组,然后在每组中选择id最高/最大的项目:

<xsl:for-each-group select="//payment[type = 'CANCELLED']" group-by="date">
  <xsl:copy-of select="current-group()[id = max(current-group()/id)]"/>
</xsl:for-each-group>


谢谢@MartinHonnen。完美的一个后续查询:当我执行max(current-group()/id)时,前导零丢失。e、 如果付款id为000004984,则变为4984。是否有任何方法同时保持前导零点和最大值?“SWAPNILPRABAGAVALKAR”,考虑用一个新的细节问一个新问题,在输入中所有的<代码> ID <代码> s都有相同的位数,你能做与前导零点条带的数字比较,但是允许你以后使用例如“格式整数”(max)。(current-group()/id),'0000000000')将最大值格式化为所需的位数?谢谢@MartinHonnen。我已使用格式编号修复了此问题,因为位数已修复(10)。