6

この単純な xml があるとします...

 <books>   
    <book>
       <author/>
       <title/>
    </book>
    <book>
       <author/>
       <title/>
    </book>
 </books>

この xpath を使用して、最初の本のインスタンスの要素を取得しています。

//books[1]/*

戻り値

<author/>
<title/>

これで問題なく動作しますが、local-name() を使用して動作させる必要があります。次のことを試しましたが、どれも機能しません...

//*[local-name()='books']/*

これは繰り返される著者とタイトルの要素を返します。良くありません。最初の子からのみ必要です

//*[local-name()='books'][0]/*

これは何も返さない

基本的に、CSV ファイルを作成したいので、出力の最初の行は書籍の属性名とそれに続く任意のデータ値をリストしたヘッダーになります。ヘッダー部分を機能させるだけです。

author,title
john,The End is Near
sally,Looking for Answers
4

3 に答える 3

13

これは FAQです。XPath演算子は疑似演算子[]よりも優先度 (優先度) が高くなります。//

そう:

//someElemName[1]

その親の最初の子であるという名前のすべての要素を選択someElemNameします。XML ドキュメントによっては、そのような要素が複数存在する場合があります。

これを変更するには、ブラケットを使用する必要があります。

使用:

(//*[local-name() = 'book'])[1]/*

また、注意してください: XPath では、位置は 0 ベースではなく 1 ベースです。

XSLT ベースの検証:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "(//*[local-name() = 'book'])[1]/*"/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用された場合:

<books>
    <book num="1">
        <author num="1"/>
        <title num="1"/>
    </book>
    <book num="2">
        <author num="2"/>
        <title num="2"/>
    </book>
</books>

必要なノードが選択され、出力にコピーされます

<author num="1"/>
<title num="1"/>
于 2011-11-09T03:34:33.707 に答える
0

私は同じ懸念に応えなければなりません。私は次のように解決しました:

//*[local-name()='MYNODENAME' and position()=X]

良い1日を。

于 2014-10-07T07:27:44.590 に答える