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



我有这个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>

替代方法是这样的 如何选择唯一节点

相关内容

  • 没有找到相关文章

最新更新