如何检查xslt中的上一个节点值?

时间:2019-06-18 11:03:31

标签: xml xslt-1.0

我有这个xml,在其中我得到重复的节点集,我只需要打印一次。因此,我正在考虑将该值与先前的节点集值进行比较,如果不匹配,则将其打印出来。

这是我的代码:-

<xsl:for-each select="Details">
<xsl:variable name="pos" select="position()"/>
    <xsl:if test="preceding-sibling::Details/Value[$pos] !=current()">
    <xsl:variable name="sign" select="'Y'"/>
    </xsl:if> 
</xsl:for>

输入XML:-

<Details>
    <Value>10</Value>
    <name>A</name>
</Details>
<Details>
    <Value>10</Value>
    <name>A</name> 
</Details>
<Details>
    <Value>20</Value>
    <name>B</name> 
</Details>
<Details>
    <Value>20</Value>
    <name>B</name> 
</Details>
<Details>
    <Value>30</Value>
    <name>C</name> 
</Details>
<Details>
    <Value>30</Value>
    <name>C</name> 
</Details>
<Details>
    <Value>30</Value>
    <name>C</name> 
</Details>

我的输出应该是:-

<Details>
    <Value>10</Value>
    <name>A</name>
</Details>
<Details>
    <Value>20</Value>
    <name>B</name> 
</Details>
<Details>
    <Value>30</Value>
    <name>C</name> 
</Details>

所以这里它比较

的值
<Value> 
当前节点的

具有先前的“值”。 如果不相等,例如:10 <> 20,则应打印20s节点集

请帮助我正确使用前面的兄弟姐妹或任何其他替代方法。 请注意,的值不是static。它可能会在其他xml中更改,因此无需进行硬编码。 预先感谢

2 个答案:

答案 0 :(得分:1)

要实现您的逻辑,只需执行以下操作:

<xsl:copy-of select="Details[not(Value = preceding-sibling::Details[1]/Value)]"/>

但是,这假设原始XML已排序;否则,当相同的值再次出现在其第一个程序段之外时,您将得到重复项。如果这不是您想要的,请改用Muenchian grouping-效率也会更高。

答案 1 :(得分:0)

我非常确定您正在搜索:

<xsl:for-each-group select="Details" group-by=".">
    <xsl:copy-of select="."/>
</xsl:for-each-group>

与此类似的是How to select unique nodes