[英]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.