繁体   English   中英

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

[英]How to check the previous node value in 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节点集

请帮助我正确使用前面的兄弟姐妹或任何其他替代方法。 请注意,的值不是static。它可能会在其他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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM