26

我有一段像这样的XML:

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

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

我来的最远的是

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

bar

虽然这并没有告诉我第三个 foo 缺少该属性。

4

4 回答 4

38

这将选择没有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。

顺便说一句,我会避免使用“任何地方”选择器//(更不用说*通配符),除非您确定这正是您需要的。//就像让你非常渴望的狗闻一块布并告诉它,“把所有闻起来像这样的东西都带给我,无论你在哪里找到它”。你不会相信它可以决定带回来的奇怪的废话。

于 2011-04-07T14:35:45.970 回答
16

我想知道哪些元素有 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

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

于 2011-04-07T17:30:13.870 回答
5

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

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

于 2011-04-07T11:42:08.573 回答
5

使用

//*[@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属性的所有元素。

于 2011-04-07T13:39:25.377 回答