web-dev-qa-db-ja.com

XML属性のテスト

私はそのようなXMLの一部を持っています:

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

どの要素にはsrc属性がありますで、どれが空で、どれが値を持つか知りたいです。

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

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

bar

3番目のfooに属性が欠落していることはわかりませんが。

23
hendry

これにより、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です。

15
user357812

/root/foo[string-length(@src)!=0] return all foo要素に空でない値があります。

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

5
TOUDIdel

使用

//*[@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ドキュメント内のすべての要素が選択されます。

5