私は次のようなXMLを持っています:
<root>
<foo src=""/>
<foo src="bar"/>
<foo />
</root>
どの要素がsrc属性を持ち、どの要素が空で、どの要素に値があるのか知りたいです。
私が来た中で最も遠いのは
$ xmlstarlet sel -t -m '//foo' -v @src -n foo.xml
bar
それは私に3番目のfooが属性を欠いていることを教えてくれませんが。
私は次のような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と@DimitreNovatchevによって指摘された式を組み合わせて使用します
。/root/foo[@src and string-length(@src)=0]
空の.を含むfooと、コンテンツを含むfooの場合です。src
/root/foo[@src and string-length(@src)!=0]
src
余談ですが、これが特に必要なものであることが確実でない限り、「どこでも」セレクター//
(ワイルドカードは言うまでもなく*
)の使用は避けます。//
とても熱心な犬に一枚の布を嗅がせて、「このようなにおいがするものはどこにでも持ってきてください」と言うようなものです。あなたはそれが持ち帰ることを決めることができる奇妙ながらくたを信じないでしょう。
どの要素が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要素が空でない値を持っていることを返します。
残念ながら、 src属性/root/foo[string-length(@src)=0]
を持たない要素と、 src属性を持っているが空の要素を示します。
使用:
//*[@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ドキュメント内のすべての要素が選択されます。