私はそのようなXMLの一部を持っています:
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
どの要素にはsrc属性がありますで、どれが空で、どれが値を持つか知りたいです。
私が来た中で最も遠いのは
$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml
bar
3番目のfooに属性が欠落していることはわかりませんが。
これにより、src
属性のないfooが選択されます。
/root/foo[not(@src)]
他の2つのタスクでは、@ TOUDIdelと@Dimitre Novatchevによって指摘された式の組み合わせを使用します。src
が空のfoosの場合は/root/foo[@src and string-length(@src)=0]
、内容がsrc
のfoosの場合は/root/foo[@src and string-length(@src)!=0]
です。
余談ですが、これが具体的に必要なものであることが確実でない限り、「どこでも」セレクタ//
(*
ワイルドカードは言うまでもありません)の使用は避けます。 //
は、非常に熱心な犬に布の匂いを嗅ぎつけ、「どこにいても、このような匂いがするものはすべて持ってきてくれ」と言います。あなたはそれが持ち帰ることを決めることができる奇妙ながらくたを信じないでしょう。
どの要素にsrc属性があり、空で値を持つ要素を知りたいです。
空(文字列値なし)の@src
属性を持つ要素:
//*[@src[not(string())]]
値(string-value)を持つ@src
属性を持つ要素:
//*[string(@src)]
から http://www.w3.org/TR/xpath/#section-String-Functions
ドキュメントセットの最初にあるノードセット内のノードの文字列値を返すことにより、ノードセットは文字列に変換されます。ノードセットが空の場合、空の文字列が返されます。
http://www.w3.org/TR/xpath/#function-boolean から
文字列は、その長さがゼロ以外の場合にのみtrueです。
/root/foo[string-length(@src)!=0]
return all foo要素に空でない値があります。
残念ながら/root/foo[string-length(@src)=0]
はsrc属性を持たない要素を示し、要素はsrc属性を持ちますが空です。
使用:
//*[@src and not(string-length(@src))]
これにより、文字列値の長さがゼロのsrc
属性を持つXMLドキュメント内のすべての要素が選択されます。
//*[@src and string-length(@src)]
これにより、文字列値の長さがゼロではないsrc
属性を持つXMLドキュメント内のすべての要素が選択されます。
//*[@src and string-length(normalize-space(@src))]
これにより、XMLドキュメント内でsrc
属性を持つすべての要素が選択されます。開始および終了の空白を除いた後の文字列値の長さがゼロではありません。
//[not(@src)]
これにより、src
属性を持たないXMLドキュメント内のすべての要素が選択されます。