查找重复值并从XSLT 2.0中的选择中删除

时间:2019-12-20 07:38:10

标签: xml xslt xslt-2.0

我有一个代码,可以找到所有子节点(在同一父节点中)并合并值。

<xsl:template name="GetAllCompanys">
    <xsl:param name = "currZOFLFA1"/>

    <xsl:for-each select="$currZOFLFA1/*:ZRTLFA1">
        <xsl:choose>
            <xsl:when test="position() = 1">
                <xsl:value-of select="./*:BUKRS"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat(', ', ./*:BUKRS)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

此代码工作正常,但现在我需要执行一项操作来检查如果不同的父级之间存在重复值,则应跳过/删除。 例如:我有一个这样的输入xml

<DOC BEGIN="1">
<E1WYT3M SEGMENT="1">
    <ZOFLFA1 SEGMENT="1">
        <WERKS/>
        <ZRTLFA1 SEGMENT="1">
            <LIFN2>0010002493</LIFN2>
            <BUKRS>0155</BUKRS>
        </ZRTLFA1>
        <ZRTLFA1 SEGMENT="1">
            <LIFN2>0010002493</LIFN2>
            <BUKRS>0156</BUKRS>
        </ZRTLFA1>
        <ZRTLFA1 SEGMENT="1">
            <LIFN2>0010002493</LIFN2>
            <BUKRS>0158</BUKRS>
        </ZRTLFA1>
        <ZRTLFA1 SEGMENT="1">
            <LIFN2>0010002493</LIFN2>
            <BUKRS>0170</BUKRS>
        </ZRTLFA1>
    </ZOFLFA1>
</E1WYT3M>
<E1WYT3M SEGMENT="1">
    <ZOFLFA1 SEGMENT="1">
        <WERKS>MA04</WERKS>
        <ZRTLFA1 SEGMENT="1">
            <LIFN2>0010002493</LIFN2>
            <BUKRS>0155</BUKRS>
        </ZRTLFA1>
    </ZOFLFA1>
</E1WYT3M>
<E1WYT3M SEGMENT="1">
    <ZOFLFA1 SEGMENT="1">
        <WERKS>MA05</WERKS>
        <ZRTLFA1 SEGMENT="1">
            <LIFN2>0010002493</LIFN2>
            <BUKRS>0156</BUKRS>
        </ZRTLFA1>
    </ZOFLFA1>
</E1WYT3M>
</DOC>

根据我当前的代码,对于第一个E1WYT3M元素,它将从BUKRS中选择一个值并将其加起来,这将返回字符串“ 0155、0156、0158、0170”。

现在,我要检查另一个E1WYT3M-BUKRS是否具有相同的值,如果是,则应将其删除。
因此 由于复制了0155和0156,预期结果将为“ 0158,0170”

我已经搜索了很多有关如何查找重复值的讨论,但是我不知道在选择时应如何删除它。感谢任何帮助

1 个答案:

答案 0 :(得分:0)

首先,您当前的代码可以简化为:

<xsl:template name="GetAllCompanys">
    <xsl:param name = "currZOFLFA1"/>
    <xsl:value-of select="$currZOFLFA1/*:ZRTLFA1/*:BUKRS" separator=", "/>
</xsl:template>

(假设模板的调用者不介意将结果作为单个文本节点而不是一系列文本节点返回)。

然后,要删除重复项,您只需执行以下操作:

<xsl:template name="GetAllCompanys">
    <xsl:param name = "currZOFLFA1"/>
    <xsl:value-of select="distinct-values($currZOFLFA1/*:ZRTLFA1/*:BUKRS)"
                  separator=", "/>
</xsl:template>

distinct-values()函数不能保证结果的顺序;如果这是一个问题,您可能要改用xsl:for-each-group