2010-04-19 36 views
6

我需要過濾XPath表達式以僅抓取某個屬性爲非空。XPath過濾器不爲空的子元素

我嘗試這樣做:

<xsl:template match="DocumentElement/QueryResults[string(@FileName)]"> 

這:

<xsl:template match="DocumentElement/QueryResults[string-length(@FileName)>0]"> 

,但沒有奏效。我需要的同類數據從folloing XPath表達式返回的......

<xsl:template match="DocumentElement/QueryResults"> 

...但過濾,以避免與空屬性@FileName項目。

謝謝!

回答

8

由於FileName是一個子元素,而不是一個屬性,因此您需要像訪問它一樣訪問它,而不是在節點名稱前使用屬性限定符@

嘗試:

<xsl:template match="DocumentElement/QueryResults[FileName]"> 

這將選擇有FileName子元素DocumentElement/QueryResults元素。

但是,如果你總是有一個FileName子元素(有時是空的),你要選擇非空的,試試這個:

<xsl:template match="DocumentElement/QueryResults[string-length(FileName) &gt; 0]"> 
+0

Os,對不起,我剛剛發現「FileName」不是屬性,但實際上是一個節點。我怎樣才能檢查它不是空的?謝謝。 – 2010-04-19 20:01:01

+0

@Marcos - 這會解釋你遇到的問題......更新回答(只刪除屬性限定符@)。 – Oded 2010-04-19 20:16:47

+0

謝謝,我不是XPATH專家,我遇到了我正在使用的軟件和解析器的奇怪行爲問題。由於源數據正在通過SQL查詢進行抽取,因此我已對其應用了WHERE子句,而不是在XPATH表達式中使用過濾器。謝謝。 – 2010-04-19 21:30:51

3
<xsl:template match="DocumentElement/QueryResults[FileName != '']"> 

這只是一個快速的猜測,我很長一段時間沒有使用XPath/XSLT。不過,如果它是空的,那麼應該跳過它。雖然我更喜歡使用像string-length這樣的函數,但並非所有的UA都支持它們(特別是客戶端XSLT分析器幾乎不能與XPath和XSLT 1.0一起使用,也不會介紹XSLT 2.0和XPath提供的有用功能和功能)。

+0

謝謝,我不是XPATH專家,我遇到了我使用的軟件和解析器的奇怪行爲問題。由於源數據正在通過SQL查詢獲取,因此我已將該過濾器應用於該數據庫,而不是在XPATH表達式中使用過濾器。不管怎麼說,還是要謝謝你。 – 2010-04-19 21:29:35