【问题标题】:Find duplicate value and remove from select in XSLT 2.0在 XSLT 2.0 中查找重复值并从选择中删除
【发布时间】:2019-12-20 07:38:10
【问题描述】:

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

<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 是否有相同的值,如果是,则应将其删除。
因此, 预期结果将是“0158, 0170”,因为 0155 和 0156 是重复的。

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

【问题讨论】:

  • 请 (1) 将预期结果添加到您的问题中并 (2) 说明您的处理器支持的 XSLT 版本。
  • XSLT 2.0 版
  • 请尝试在某个时间回复您收到的答案。
  • 只需尝试您的答案并对其进行一些修改。但是我看到您的答案已被删除,无法使其“接受”

标签: xml xslt xslt-2.0


【解决方案1】:

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

<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

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多