2010-04-19 65 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