当第一个元素出现在层次结构的不同位置时,该元素与之匹配?

时间:2019-07-15 11:42:34

标签: xml xslt xpath

因此,此元素可能出现在许多元素中,我应该删除特定元素或其后代中的所有元素。我似乎无法弄清楚该如何处理,因为该关系不是“固定的”。因此,我提供了一个例子来阐明我的观点:

输入:

<a>
    <b>
        <d value="1"></d>
    <b/>
    <b>
        <c>
            <d value="2"></d>
            <d value="1"></d>
        </c>
        <d value="1">
        <d value="2">
    <b/>
</a>

想要的输出:

<a>
    <b>
        <d value="1"></d>
    <b/>
    <b>
        <c>
            <d value="2"></d>
        </c>
    <b/>
</a>

您会看到输出仅包含第一个值为value =“ 1”或value =“ 2”的元素。 XSL甚至有可能吗?

1 个答案:

答案 0 :(得分:1)

您可以在Muenchian grouping上使用变体形式:

XSLT 1.0

<xsl:stylesheet version="1.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:key name="d-by-value" match="d" use="@value" />

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

<!-- remove duplicate d's -->
<xsl:template match="d[count(. | key('d-by-value', @value)[1]) != 1]"/>

</xsl:stylesheet>