2014-02-11 186 views
0

我一直在試圖檢查一個特定的節點是否包含其中的另一個節點,不一定是它的孩子,而是作爲它的孩子的孩子等等。XSLT測試XML節點是否包含另一個XML節點?

例如:

<a> 
    <c> looking for me?</c> 
</a> 

<a> 
    <b> 
     <c>looking for me?</c> 
    </b> 
</a> 

在上述情況下我尋找含有c節點的a節點。 在上述兩種情況下都應通過測試,因爲兩個a節點都包含一個c節點。

我想在每個a的環境中使用//c的,但不會是所有選擇中的XML,而不是特定的a裏面的一個c節點?如果是的話,任何人都可以建議我做一個方法嗎?

Thnx提前!

回答

4

通過@Lingamurthy CS給出的答案是錯的。 //c在輸入XML中找到c元素任何地方

而是使用:

<xsl:template match="a[descendant::c]"> 
其中 a元素相匹配

,如果它有一個後代元素c

爲了證明這一點,假設以下XML輸入。有一個c元素,但它不是a的後代。

輸入XML(修改)

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <a> 
    </a> 
    <c>wrong</c> 
    <a> 
     <b> 
     </b> 
    </a> 
</root> 

輸出(使用@Lingamurthy CS」模板)

<?xml version="1.0" encoding="UTF-8"?> 
    <yes/> 
    wrong 
    <yes/> 

正如你所看到的,test="exists(//c)"評估在這兩種情況下,以 「真」 - 這是錯誤的。不應輸出yes元素。

在另一方面,使用:

樣式表

<?xml version="1.0" encoding="utf-8"?> 

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

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="a[descendant::c]"> 
     <yes/> 
    </xsl:template> 

</xsl:stylesheet> 

應用於相同輸入I以上描述,結果在

輸出(使用descendant::c

<?xml version="1.0" encoding="UTF-8"?> 


    wrong 

否輸出yes元素。由於XSLT處理器的默認行爲,只輸出c元素的文本內容。 「尋找我?」

+0

嗯,該模板僅用於由Surender提供的輸入XML,它只有一個'a'作爲根節點。 :) –

+0

我知道。這就是我想說的。您的解決方案並不真正檢查'a'元素是否具有後代'c'元素。相反,它檢查是否有'c'元素_at all_。 –

0

使用 '//' 跳過兒童水平的任意數:

//a//c 
+0

只是一個示例文本。它不存在於實際的XML中。 –

+0

@SurenderThakran,然後不要將其包含在搜索模式中(請參閱我的上一次編輯) – spektom

相關問題