XSLT 2.0中的迭代和连接

时间:2017-11-19 17:23:07

标签: xslt-2.0

我是XSLT的新手,并且难以使用XSLT 2.0对编码逻辑进行迭代和连接。我提供下面的场景。

输入XML:

<ADR_ENTR>
    <ADR_ENTR_VW>
        <ADR_LINE>
            <TEXT>LINE1</TEXT>
        </ADR_LINE>
        <ADR_LINE>
            <TEXT>LINE2</TEXT>
        </ADR_LINE>
        <ADR_LINE>
            <TEXT>LINE3</TEXT>
        </ADR_LINE>
        <ADR_LINE>
            <TEXT>LINE4</TEXT>
        </ADR_LINE>
    </ADR_ENTR_VW>
</ADR_ENTR>

聚合中可以有任意数量的ADR_LINE聚合,我需要按原样输出第一个ADR_LINE,然后需要连接ADR_LINE 2 - 4,然后需要连接ADR_LINE 4到最后一个ADR_LINE。

示例输出响应:

<ADR_ENTR>
    <ADR_ENTR_VW>
        <ADR_LINE>
            <TEXT>LINE1</TEXT>
        </ADR_LINE>
        <ADR_LINE>
            <TEXT>LINE2 LINE3 LINE 4</TEXT>
        </ADR_LINE>
    </ADR_ENTR_VW>
</ADR_ENTR>

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这可以通过一个简单的模板来完成,该模板将第一个<ADL_LINE>插入到自己的元素中,然后将所有其他元素连接成第二个:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="ADR_ENTR/ADR_ENTR_VW">
        <ADR_ENTR>
            <ADR_ENTR_VW>
                <ADR_LINE>
                    <TEXT>
                        <xsl:value-of select="ADR_LINE[1]"/>
                    </TEXT>
                </ADR_LINE>
                <ADR_LINE>
                    <TEXT>
                        <xsl:value-of select="string-join(ADR_LINE[position()!=1],' ')"/>
                    </TEXT>
                </ADR_LINE>
            </ADR_ENTR_VW>
        </ADR_ENTR>
    </xsl:template>
</xsl:stylesheet>

此行使用position = 1谓词

选择第一个<ADR_LINE>

<xsl:value-of select="ADR_LINE[1]"/>

然后,该行迭代除第一个之外的所有其他<ADR_LINE>元素,将它们与空格分隔符连接起来:

<xsl:value-of select="string-join(ADR_LINE[position()!=1],' ')"/>

答案 1 :(得分:0)

您也可以使用它。

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="ADR_ENTR_VW">
    <ADR_ENTR_VW>
        <ADR_LINE>
            <TEXT>
                <xsl:value-of select="normalize-space(ADR_LINE[1])"/>
            </TEXT>
        </ADR_LINE>
        <ADR_LINE>
            <TEXT>
                <xsl:value-of select="normalize-space(string-join(ADR_LINE[position() != 1],' '))"/>
            </TEXT>
        </ADR_LINE>
    </ADR_ENTR_VW>
</xsl:template>