26

私は次のようなXMLを持っています:

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

どの要素がsrc属性を持ち、どの要素が空で、どの要素に値があるのか​​知りたいです。

私が来た中で最も遠いのは

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

bar

それは私に3番目のfooが属性を欠いていることを教えてくれませんが。

4

4 に答える 4

38

srcこれにより、属性のないfooが選択されます。

/root/foo[not(@src)]

他の2つのタスクでは、@TOUDIdelと@DimitreNovatchevによって指摘された式を組み合わせて使用​​します 。/root/foo[@src and string-length(@src)=0]空の.を含むfooと、コンテンツを含むfooの場合です。src/root/foo[@src and string-length(@src)!=0]src

余談ですが、これが特に必要なものであることが確実でない限り、「どこでも」セレクター//(ワイルドカードは言うまでもなく*)の使用は避けます。//とても熱心な犬に一枚の布を嗅がせて、「このようなにおいがするものはどこにでも持ってきてください」と言うようなものです。あなたはそれが持ち帰ることを決めることができる奇妙ながらくたを信じないでしょう。

于 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要素が空でない値を持っていることを返します。

残念ながら、 src属性/root/foo[string-length(@src)=0]を持たない要素と、 src属性を持っているが空の要素を示します。

于 2011-04-07T11:42:08.573 に答える
5

使用

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

srcこれにより、文字列値の長さがゼロの属性を持つXMLドキュメント内のすべての要素が選択されます。

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

srcこれにより、文字列値の長さがゼロではない属性を持つXMLドキュメント内のすべての要素が選択されます。

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

srcこれにより、開始空白と終了空白を除外した後の文字列値の長さがゼロではない属性を持つXMLドキュメント内のすべての要素が選択されます。

//[not(@src)]

srcこれにより、属性を持たないXMLドキュメント内のすべての要素が選択されます。

于 2011-04-07T13:39:25.377 に答える