我有一段像这样的XML:
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
我想知道哪些元素有 src 属性,哪些是空的,哪些有值。
我来的最远的是
$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml
bar
虽然这并没有告诉我第三个 foo 缺少该属性。
我有一段像这样的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]
对于带有空src
的/root/foo[@src and string-length(@src)!=0]
foos 和src
带有内容的 foos。
顺便说一句,我会避免使用“任何地方”选择器//
(更不用说*
通配符),除非您确定这正是您需要的。//
就像让你非常渴望的狗闻一块布并告诉它,“把所有闻起来像这样的东西都带给我,无论你在哪里找到它”。你不会相信它可以决定带回来的奇怪的废话。
我想知道哪些元素有 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
当且仅当字符串的长度非零时,字符串才为真。
/root/foo[string-length(@src)!=0]
返回所有foo元素具有非空值。
不幸的是/root/foo[string-length(@src)=0]
,表示没有src属性的元素,并且元素具有src属性但为空。
使用:
//*[@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
属性的所有元素。