2013-07-09 72 views
1

我有類似結構的XML文件XSL 1.0雙節點的差集

<?xml version="1.0"?> 
<medias> 
    <media> 
    <id>34500</id> 
    <refid/> 
    </media> 
    <media> 
    <id>34501</id> 
    <refid>34500</refid> 
    </media> 
    <media> 
    <id>34502</id> 
    <refid>34500</refid> 
    </media> 
    <media> 
    <id>34503</id> 
    <refid>34501</refid> 
    </media> 
<media> 
    <id>34504</id> 
    <ref/> 
</media> 
<media> 
    <id>34505</id> 
    <refid>34502</refid> 
</media> 
</medias> 

隨着XSL 1.0,我想訪問沒有被別人引用的所有節點。 所以我創建了兩個變量

<xsl:variable name="origID" select="media/id/text()"/> 
<xsl:variable name="refID" select="media/refid/text()"/> 

,擡頭就如何將這兩個元素之間進行差異操作來設置

<xsl:variable name="diffID" select="$origID[count(. | $refID) != count($refID)]"/> 

結果是:

origID含有34500,34501, 34502,34503,34504,34505

refID包含34500,34 500,34501,34502

我預計

diffID將包含34503,34504,34505

diffID仍含有34500,34501,34502,34503,34504, 34505.

什麼是最好的方法來實現我的目標,以獲得所有節點的參考ID由其他節點。

在此先感謝

安德烈

+0

Andre請發佈您的XSLT 。謝謝彼得 – Peter

+0

感謝提示彼得。我沒有注意到XSLT在最後一篇文章中缺失。我的標籤已經在我的問題中,但沒有將其格式化爲代碼,因此它們被隱藏在前端視圖中。現在它應該工作。 –

+0

沒問題,我看到你已經得到答案了。 – Peter

回答

1

爲了得到這不由REFID引用到一個變量的ID,你可以試試這個:

<xsl:variable name="diffID" select="media[not(id = //media/refid)]/id"/> 

以表明它的工作使用:

<xsl:template match="/*"> 
    <xsl:variable name="diffID" select="media[not(id = //media/refid)]/id"/> 
    <xsl:for-each select="$diffID" > 
     <xsl:value-of select="."/> 
     <xsl:text>, </xsl:text> 
    </xsl:for-each> 
</xsl:template> 

這將生成以下輸出。

34503, 34504, 34505, 

如果真正的文件要大得多,你應該使用xsl:key

而且在變量做相同的ID:

<xsl:template match="/*"> 
    <xsl:variable name="origID" select="media/id"/> 
    <xsl:variable name="refID" select="media/refid"/> 
    <xsl:variable name="diffID" select="$origID[not(. = $refID)]"/> 
    <xsl:for-each select="$diffID" > 
     <xsl:value-of select="."/> 
     <xsl:text>, </xsl:text> 
    </xsl:for-each> 
</xsl:template> 
+0

這真是神奇。大。非常感謝你的例子! –

1

使用XSLT 2.0,你可以使用except運營商(如只要您選擇節點而不是原始值):

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:variable name="medias-with-id" select="//media[id]"/> 
<xsl:variable name="referenced-medias" select="key('by-id', //refid)"/> 

<xsl:key name="by-id" match="media" use="id"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="$medias-with-id except $referenced-medias"/> 
</xsl:template> 

</xsl:stylesheet>