2012-11-21 98 views
2

我正在使用XSLT樣式表。我有一個節點(節點A)和一羣孩子,我正在循環另一個節點(節點B)的孩子。我想每一個時間節點B的孩子也是節點A的孩子做一些事情,所以我有這樣的代碼:爲什麼我必須將此節點分配給樣式表中的變量?

<xsl:if test="$prodbins/bin[./text()=/root/Line[1]/Element[6]/text()]"> 

但不起作用(測試失敗;表達式返回false ),即使表達式的左側和右側在單獨計算時相等。

但是,當我這樣做:

<xsl:variable name="curbin" select="/root/Line[1]/Element[6]/text()"/> 
<xsl:if test="$prodbins/bin[./text()=$curbin]"> 

的表達式的值爲true。爲什麼我必須使用$ curbin變量來獲得我期待的結果?

+0

你可以嘗試'的'(notice current()function) - 如果查詢變量,我不記得它是否有效。它不起作用的原因是因爲你查詢變量'/'查找變量內容的根節點,而不是你正在變換的源文檔。如果我沒有記錯,'current()'應該返回你所在模板的上下文元素。 – Pawel

+0

這確實有效。讓我看看我是否理解你是正確的 - 在'test'子句中,'/'是指'$ prodbins'的根,而不是文檔的根?非常有趣 - 我不知道。想要將其作爲答案發布?看起來對我來說是決定性的...... – Aerik

+0

@Aerik,這沒有意義,'/'總是選擇當前上下文節點所屬的文檔。你正在處理多個文檔嗎? – acelent

回答

2

你可以試試<xsl:if test="$prodbins/bin[./text()=current()/root/Line[1]/Element[6]/text()]">(注意current()函數)。它在原始表達式中不起作用的原因是,因爲您查詢變量,因此/將查找變量內容的根節點,而不是要轉換的源文檔。電流()應返回你在模板中的上下文元素。

1

我的猜測是$prodbins/bin是一個節點(-set)屬於不同的文件比文件包含的比較對象節點。

在表達式:

$prodbins/bin[./text()=/root/Line[1]/Element[6]/text()] 

子表達式

/root/Line[1]/Element[6]/text() 

相同文件作爲一個是從該$prodbins/bin節點選擇的文檔選擇。指定

一種方式成功通緝comparisson是

<xsl:variable name="vDoc" select="/"/> 

<xsl:if test="$prodbins/bin[./text()=$vDoc/root/Line[1]/Element[6]/text()]"> 
相關問題