我有这个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中更改,因此无需进行硬编码。 预先感谢
答案 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>