带有分隔符的循环中的 Concat 元素

Concat element in a loop with Separator

提问人:Arun M 提问时间:11/1/2023 更新时间:11/1/2023 访问量:62

问:

我面临的问题似乎很简单。我想做的是通过连接 foreach 元素循环的结果来构建一个字符串。

数据 XML:

<OutboundPaymentInstruction>
<DocumentPayable>
            <DocumentNumber>
                <ApplicationInternalID>200</ApplicationInternalID>
                <ReferenceNumber>TEST_003</ReferenceNumber>
                <DocCategory>STD INV</DocCategory>
                <SequenceName>SEQ1</SequenceName>
                <SequenceValue>520822000792</SequenceValue>
            </DocumentNumber>
</DocumentPayable>          
<DocumentPayable>
            <DocumentNumber>
                <ApplicationInternalID>200</ApplicationInternalID>
                <ReferenceNumber>TEST_004</ReferenceNumber>
                <DocCategory>STD INV</DocCategory>
                <SequenceName>SEQ1</SequenceName>
                <SequenceValue>520822000792</SequenceValue>
            </DocumentNumber>
</DocumentPayable>
<DocumentPayable>
            <DocumentNumber>
                <ApplicationInternalID>200</ApplicationInternalID>
                <ReferenceNumber>TEST_005</ReferenceNumber>
                <DocCategory>STD INV</DocCategory>
                <SequenceName>SEQ1</SequenceName>
                <SequenceValue>520822000792</SequenceValue>
            </DocumentNumber>
</DocumentPayable>
</OutboundPaymentInstruction>

预期输出:不应超过 140 个字符。TEST_003/TEST_004/TEST_005

我尝试使用XSL文件,但ReferenceNumber就像图像输入图像描述一样


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="OutboundPaymentInstruction">
        <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <xsl:variable name="Invoices" select="DocumentNumber/ReferenceNumber"/>
            <Ustrd>
                <xsl:for-each select="DocumentPayable/DocumentNumber">
                    <xsl:choose>
                        <xsl:when test="position() = 1">
                            <xsl:value-of select="ReferenceNumber"/>
                        </xsl:when>
                        <xsl:otherwise>
            /<xsl:value-of select="ReferenceNumber"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each>
            </Ustrd>
        </Document>
    </xsl:template>
</xsl:stylesheet>

请帮忙。

XML XSLT

评论

0赞 Yitzhak Khabinsky 11/1/2023
在询问 XSLT 问题时,您需要提供一个最小的可重现示例:(1) 格式正确的输入 XML。(2) 您的逻辑,以及尝试实现它的完整可执行 XSLT 样式表。(3) 所需的输出,基于上面 #1 中的示例 XML。(4) XSLT 处理器及其符合 XSLT 标准:1.0、2.0、3.0 或 4.0。
0赞 Arun M 11/2/2023
我已经提供了你提到的所有内容。你能再看一遍吗?
0赞 Yitzhak Khabinsky 11/2/2023
##3,4 仍然缺失

答:

0赞 Rob Eyre 11/1/2023 #1

您可以简化 for-each 循环的内容,并省略隐式空格:

            <xsl:for-each select="DocumentPayable/DocumentNumber">
                <xsl:if test="position() &gt; 1">
                    <xsl:text>/</xsl:text>
                </xsl:if>
                <xsl:value-of select="ReferenceNumber"/>
            </xsl:for-each>

评论

0赞 Arun M 11/2/2023
如何将结果限制为 140 个字符?
0赞 Arun M 11/7/2023
谢谢,这有效,但是我们如何将输出限制为 140 个字符?
0赞 Yitzhak Khabinsky 11/1/2023 #2

一个函数调用就可以完成这项工作,而无需任何循环。

XSLT 2.0 片段

string-join(/OutboundPaymentInstruction/DocumentPayable/DocumentNumber/ReferenceNumber, "/")

输出

TEST_003/TEST_004/TEST_005

评论

0赞 michael.hor257k 11/1/2023
string-join()需要 XSLT 2.0+。
0赞 Michael Kay 11/1/2023 #3

XSLT 会忽略样式表中完全由空格组成的文本节点,但不会忽略与可见文本相邻的空格。因此,在您的示例中,“/”分隔符前面的空格被认为是重要的。您可以通过使用 或将其包含在指令值中来解决这个问题:<xsl:text>/</xsl:text>

<xsl:value-of select="concat('/', ReferenceNumber)"/>

评论

0赞 Arun M 11/3/2023
如何将结果限制为 140 个字符?
0赞 Michael Kay 11/3/2023
最好一次问一个问题,最好告诉我们您使用的是哪个 XSLT 版本。
0赞 Arun M 11/4/2023
我一下子问你们没有完全阅读它..我已经提到过它的预期输出
0赞 Michael Kay 11/4/2023
有几个人问您使用的是哪个版本的 XSLT,但您没有回答。我不会浪费我和你的时间给你一个可能不适用于你的 XSLT 版本的答案。
0赞 Arun M 11/5/2023
在示例 XSL 中已经提到过,版本是 1.0....