我有一段像这样的XML:
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
我想知道哪些元素具有src属性,这些属性为空且具有值。
我来得最远的是
$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml
bar
虽然这并没有告诉我第三个foo缺少属性。
答案 0 :(得分:31)
这将选择没有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]
为包含内容src
的foos。
顺便说一句,我会避免使用“任意位置”选择器//
(更不用说*
通配符),除非你确定这是你需要的具体内容。 //
就像让你非常渴望的狗嗅一块布告诉它,“把你闻到的所有气味带给我,无论你在哪里找到它”。你不会相信它可以决定带回来的怪异废话。
答案 1 :(得分:14)
我想知道哪些元素具有src属性,这些属性为空且具有值。
具有@src
属性为空的元素(无字符串值):
//*[@src[not(string())]]
具有@src
属性且具有值(字符串值)的元素:
//*[string(@src)]
来自http://www.w3.org/TR/xpath/#section-String-Functions
通过返回文档顺序中第一个节点集中节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回空字符串。
来自http://www.w3.org/TR/xpath/#function-boolean
当且仅当其长度为非零时,字符串才为真。
答案 2 :(得分:4)
/root/foo[string-length(@src)!=0]
返回所有 foo 元素的非空值。
不幸的是/root/foo[string-length(@src)=0]
表示没有 src 属性的元素,而且元素的 src 属性也是空的。
答案 3 :(得分:4)
使用强>:
//*[@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
属性的所有元素。