2011-04-07 55 views
16

我有一块XML的像这样:测试一个XML属性

<root> 
    <foo src=""/> 
    <foo src="bar"/> 
    <foo /> 
</root> 

我想知道哪些元素具有src属性,这是空的,哪些具有价值。

我来的最远的是

$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml 

bar 

虽然这并没有告诉我第三FOO缺少的属性。

+0

好问题,+1。查看我的答案,获取每个案例的完整和简短解决方案(单行XPath表达式)。 :) – 2011-04-07 13:40:24

+0

@Dimitre:“完整”:不完全... – 2011-04-07 15:18:03

回答

23

这将选择没有src属性的foos。

/root/foo[not(@src)] 

对于其他两项任务,我会使用表达式的混合指出的@TOUDIdel和@Dimitre Novatchev: /root/foo[@src and string-length(@src)=0]用于FOOS与空src,并/root/foo[@src and string-length(@src)!=0]用于FOOS在一个src与内容它。除此之外,我会避免使用“任意位置”选择器//(更不用说*通配符),除非您确定这是您特别需要的。 //就像是让你非常渴望的狗嗅一块布告诉它,“把所有闻起来像这样的东西,无论你在哪里找到它都带给我”。你不会相信它可以决定带回来的奇怪废话。

+1

我爱狗和布比喻!= 0 – Dustin 2013-12-12 08:54:19

+0

谢谢你的回答,我在哪里可以找到“字符串长度“功能和其他? – someone 2016-03-07 22:21:04

+0

https://www.w3.org/TR/xpath/#function-string-length – 2016-03-08 08:15:27

2

/root/foo[string-length(@src)!=0]全部返回foo元素具有非空值。

不幸的是/root/foo[string-length(@src)=0]表示不具有SRC元素属性,也有要素的src 属性但空。

+0

那么这并不能解决问题呢!我需要重点区分属性何时缺失和何时属性为空。 :-) – hendry 2011-04-07 12:13:37

2

使用

//*[@src and not(string-length(@src))] 

这将选择的XML文档在具有src属性,其字串值具有零长度的所有元素。

//*[@src and string-length(@src)] 

这将选择的XML文档在具有src属性,其字符串值具有长度不为零的所有元素。

//*[@src and string-length(normalize-space(@src))] 

这将选择的XML文档在具有src属性,其不包括起始和结束空白后字符串值具有长度不为零的所有元素。

//[not(@src)] 

这将选择XML文档中没有src属性的所有元素。

+0

我仍然没有看到测试src属性的方法。 :/我想标记''因为缺少src属性。 – hendry 2011-04-07 13:48:16

+0

@Hendry:为什么所有的表达式都测试了一下:'someExpr [@src]'表示:选择'someExpr'选择的所有节点,并具有'src'属性。 – 2011-04-07 14:37:14

+0

@Dimetre:拼写出来,他的意思是测试'src'属性不存在。只需使用'not'运算符;看到我的答案。 – 2011-04-07 14:53:59

10

我想知道哪些元素具有src属性,它们是空的并且具有值。具有@src属性,它是空的(没有字符串值)

元素:具有@src属性具有值(字符串值)

//*[@src[not(string())]] 

元素:

//*[string(@src)] 

http://www.w3.org/TR/xpath/#section-String-Functions

通过返回首先按文档顺序排列的节点集中节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回空字符串。

http://www.w3.org/TR/xpath/#function-boolean

的字符串为真,当且仅当其长度为非零的。

+0

会'// * [not(string())]'是指没有任何属性的东西吗? – someone 2016-03-07 22:44:28