簡體   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