我有一块XML的像这样:测试一个XML属性
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
我想知道哪些元素具有src属性,这是空的,哪些具有价值。
我来的最远的是
$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml
bar
虽然这并没有告诉我第三FOO缺少的属性。
我有一块XML的像这样:测试一个XML属性
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
我想知道哪些元素具有src属性,这是空的,哪些具有价值。
我来的最远的是
$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml
bar
虽然这并没有告诉我第三FOO缺少的属性。
这将选择没有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
与内容它。除此之外,我会避免使用“任意位置”选择器//
(更不用说*
通配符),除非您确定这是您特别需要的。 //
就像是让你非常渴望的狗嗅一块布告诉它,“把所有闻起来像这样的东西,无论你在哪里找到它都带给我”。你不会相信它可以决定带回来的奇怪废话。
/root/foo[string-length(@src)!=0]
全部返回foo元素具有非空值。
不幸的是/root/foo[string-length(@src)=0]
表示不具有SRC元素属性,也有要素的src 属性但空。
那么这并不能解决问题呢!我需要重点区分属性何时缺失和何时属性为空。 :-) – hendry 2011-04-07 12:13:37
使用:
//*[@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
属性的所有元素。
我仍然没有看到测试src属性的方法。 :/我想标记'
@Hendry:为什么所有的表达式都测试了一下:'someExpr [@src]'表示:选择'someExpr'选择的所有节点,并具有'src'属性。 – 2011-04-07 14:37:14
@Dimetre:拼写出来,他的意思是测试'src'属性不存在。只需使用'not'运算符;看到我的答案。 – 2011-04-07 14:53:59
我想知道哪些元素具有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
的字符串为真,当且仅当其长度为非零的。
会'// * [not(string())]'是指没有任何属性的东西吗? – someone 2016-03-07 22:44:28
好问题,+1。查看我的答案,获取每个案例的完整和简短解决方案(单行XPath表达式)。 :) – 2011-04-07 13:40:24
@Dimitre:“完整”:不完全... – 2011-04-07 15:18:03