16

XPath と名前空間のサポートの背後にあるストーリーは何ですか? 仕様としての XPath は名前空間より前にありましたか? 要素にデフォルトの名前空間が与えられているドキュメントがある場合:

<foo xmlns="uri" />

//foo名前空間が原因でXPath プロセッサ ライブラリの一部が認識しないように見えますが、他のライブラリは認識します。私のチームが考えたオプションは、正規表現を使用して XPath に名前空間プレフィックスを追加することです (XmlNameTable を介して名前空間プレフィックスを追加できます) が、XPath はノード テストに関して非常に柔軟な言語であるため、これは脆弱に思えます。

これに適用される基準はありますか?

私のアプローチは少しハックですが、うまくいくようです。xmlns検索/置換で宣言を削除してから、XPath を適用します。

string readyForXpath = Regex.Replace(xmldocument, "xmlns=\".+\"", String.Empty );

それは公正なアプローチですか、それとも誰かがこれを別の方法で解決しましたか?

4

5 に答える 5

15

local-name() が必要です:

http://www.w3.org/TR/xpath#function-local-name

http://web.archive.org/web/20100810142303/http://jcooney.net:80/archive/2005/08/09/6517.aspxからクリブするには:

<foo xmlns='urn:foo'>
  <bar>
    <asdf/>
  </bar>            
</foo>

この式は「bar」要素に一致します。

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

これはしません:

 //bar
于 2008-08-14T17:15:17.927 に答える
10

私は、palehorse が提案したものと同様のことを試みましたが、うまくいきませんでした。公開されたサービスからデータを取得していたため、xml を変更できませんでした。XmlDocument と XmlNamespaceManager を次のように使用することになりました。

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlWithBogusNamespace);            
XmlNamespaceManager nSpace = new XmlNamespaceManager(doc.NameTable);
nSpace.AddNamespace("myNs", "http://theirUri");

XmlNodeList nodes = doc.SelectNodes("//myNs:NodesIWant",nSpace);
//etc
于 2008-09-29T15:09:35.493 に答える
4

The issue is that an element without a namespace is declared to be in the NULL namespace - therefore if //foo matched against the namespace you consider to be the 'default' there would be no way to refer to an element in the null namespace.

Remember as well that the prefix for a namespace is only a shorthand convention, the real element name (Qualified Name, or QName for short) consists of the full namespace and the local name. Changing the prefix for a namespace does not change the 'identity' of an element - if it is in the same namespace and same local name then it is the same kind of element, even if the prefix is different.

XPath 2.0 (or rather XSLT 2.0) has the concept of the 'default xpath namespace'. You can set the xpath-default-namespace attribute on the xsl:stylesheet element.

于 2008-08-19T14:38:33.190 に答える
0

xslt を使用しようとしている場合は、スタイルシート宣言に名前空間を追加できます。その場合、プレフィックスがあることを確認する必要があります。そうしないと、機能しません。ソース XML にプレフィックスがない場合でも問題ありません。スタイルシートに独自のプレフィックスを追加します。

スタイルシート

<xsl:stylesheet
    xmlns:fb="uri"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="fb:foo/bar">
        <!--  do stuff here -->
    </xsl:template>
</xsl:stylsheet>

またはそのようなもの。

于 2008-08-14T17:22:27.943 に答える