我有这个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 节点集
请帮助我正确使用前面的兄弟姐妹或任何其他候补。请注意,IS not static.it 的值可能会在其他 XML 中更改,因此没有硬编码。提前致谢
要实现您的逻辑,您只需执行以下操作:
<xsl:copy-of select="Details[not(Value = preceding-sibling::Details[1]/Value)]"/>
但是,这假定原始 XML 已排序;否则,当相同的值再次出现在其第一个块之外时,您将获得重复项。如果这不是你想要的,那么使用Muenchian分组 - 它也会更有效。
确定您正在搜索以下内容:
<xsl:for-each-group select="Details" group-by=".">
<xsl:copy-of select="."/>
</xsl:for-each-group>
替代方法是这样的 如何选择唯一节点