14

次のXMLが与えられました。

<root>
  <items>
    <item>
      <title>Item</title>
      <details>
        <data xmlns="http://some_url">
          <length>10</length>
          <weight>1.2</weight>
        </data>
      </details>
    </item>
  </items>
</root>

次のXPathは機能しません。つまり、「data」要素が存在しないように何も出力されません。

/root/items/item/details/data

しかし、「data」要素の「xmlns」名前空間属性を削除すると、その内容が出力されます。「data」要素の「xmlns」名前空間属性を削除せずにxpath式がどのように機能するように見えるべきですか?

SAXONとXSL1.0を使用しています。

4

2 に答える 2

16

これは、XPath/XSLTで最もよくある質問の1つです

XPathは、接頭辞なしの要素名を「名前空間なし」に属するものとして解釈します。これが、接頭辞なしの名前のみがXPath式のノードテストとして指定されている場合に、接頭辞なしの名前がデフォルトの(空でない)名前空間に属する要素が選択されない理由です。 。

解決策は次のいずれかです:

  1. プレフィックス(たとえば"x")がデフォルトの名前空間に関連付けられている名前空間バインディングを作成し、のx:elementName代わりに指定しますelementName

  2. 次のような長くて醜くて信頼性の低い表現を使用します。*[name() = 'elementName']

上記の方法を使用したXSLT変換を次に示します1 。:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:a="http://some_url">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:value-of select=
  "/root/items/item/details/a:data/a:weight"/>
 </xsl:template>
</xsl:stylesheet>

この変換が(Saxon6.5.4またはその他の準拠XSLT1.0プロセッサを使用して)提供されたXMLドキュメントに適用される場合

<root>
    <items>
        <item>
            <title>Item</title>
            <details>
                <data xmlns="http://some_url">
                    <length>10</length>
                    <weight>1.2</weight>
                </data>
            </details>
        </item>
    </items>
</root>

正しい/必要なノードが選択され、その文字列値が出力にコピーされます

1.2
于 2012-06-12T03:40:41.887 に答える
0

XPathでは、名前空間にプレフィックスを割り当てる必要があります。http://some_urlこれを行う方法は、使用しているXPathソフトウェア/ライブラリによって異なりますが、名前空間URIを名前空間プレフィックスに関連付けると仮定するとsomeUrl、XPath式を次のように変更できます。

/root/items/item/details/someUrl:data
于 2012-06-11T13:47:30.360 に答える