2014-04-15 73 views
0

我有一個XML和XSL, 一個問題這是我的XML文檔的一部分:XSL選擇文本與除一個特定的子節點的所有孩子

<node1> 
    <node2> 
     <node3>text inside node3 I don't want select</node3> 
     text inside node2 that I want select 
     <node4> text in node4 I want select</node4> 
    </node2> 
</node1> 

節點2具有一定的文本內2子節點(節點3和節點4),我需要選擇包含在節點2中的文本和子節點4中的文本,除了節點3中的一個 。 我也說node2的結構並不總是一樣的,有時它只有一些文本,或者可能有一些帶有node3和/或node4的文本。 此外,node2內部元素的順序可能並不總是相同,但結果的順序應與XML順序中的順序相同。

感謝您的幫助。

回答

2

node2背景出發,你可以得到所有後代文本節點,除了那些一node3內使用

.//text()[not(parent::node3)] 

或更一般地,如果node3可能有子元素

<node2> 
    keep this 
    <node3>drop this <node7>drop this too</node7></node3> 
    <node4>keep this</node4> 
</node2> 

然後use ancestor:: instead of parent ::`

.//text()[not(ancestor::node3)] 
+0

我試圖測試你的第一個解決方案,但它似乎無法正常工作。就像在我的例子中一樣,它選擇node2內的文本,但不選擇node4內的文本。 –

+0

我也測試了第二種解決方案,但它顯示了同樣的問題。 –

+0

@GiulioBambini它取決於你的意思是「不選擇」 - 記住,這個表達式將返回一組文本節點,並且(在XSLT 1.0中)如果你試着把'value-of'節點設置成你get只是文檔順序中集合中_first_節點的字符串值,集合中的其餘節點將被忽略。爲了得到它們的_all_的值,你通常使用'apply-templates'或'copy-of'而不是'value-of',例如'' –

相關問題