0

.NET (または少なくとも私が使用している .NET のバージョン) に関しては、既定以外の名前空間を持つ XML ドキュメントからデータをクエリする場合、少なくとも 2 つの選択肢があることを認識しています。 :

1. use the local-name() function before referencing a
node in the xpath expression.

2. work with the XmlNamespaceManager class and assign prefixes
that then need to be referenced in the xpath expression.

最近、私は XSLCompiledTransform クラスを扱っていて、デフォルト以外の名前空間を持つ XML ファイルからデータを読み取る際に同様の問題を経験しました。

実際の XSL ファイルを作成する人は、local-name() 関数を使用する必要があることを知らない可能性があり、作業する XML ファイルを制御できない可能性があるため、コードごとに、順番に何ができるでしょうか。フォーム (/node0/node1/node2/etc) の xpath 式が XSLCompiledTransform クラスによって適切に解釈されることに耐えるには?

4

2 に答える 2

2

XSLT コードを書いている人が、XML インスタンスで使用される名前空間を知らない場合、彼らは暗闇の中で作業しています。これは、どのローカル名が使用されるかを知らないのとほぼ同じです (実際にはまったく同じです)。要素名は URI とローカル名の 2 つの部分に分かれており、両方を知る必要があるためです。事前に完全な名前がわからない場合は、いつでもワイルドカードで要素を選択してその名前を見つけることができます - これは基本的に local-name() を使用するときに行っていることです - しかし、それは大変な作業です.

于 2013-02-04T16:30:10.587 に答える
2

一般に、使用する名前空間にプレフィックスを割り当てて使用するのが適切な方法です。local-name()必要のないときに名前空間を回避するために使用するのは、かなりハックです。

あなたの質問の後半部分とあなたの要求に少し混乱しています。XslCompiledTransform クラスで使用する XPath の種類は何ですか? XSLT 自体の XPath について言及していますか?

名前空間に関する問題は、URI が一致する限り、プレフィックスは何でもかまいません。したがって、「彼らが扱うXMLファイルを制御できない」というあなたのコメントは、不当な懸念かもしれません。たとえば、入力 XML が次のようになっているとします。

<aa:root xmlns:aa="http://my.namespace.com">
   <aa:child>Hello!</aa:child>
</aa:root>

次のような XSLT を使用できます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:bb="http://my.namespace.com">
    <xsl:template match="bb:root">
       <xsl:value-of select="bb:child" />
    </xsl:template>
</xsl:stylesheet>

名前空間 URI が一致するため、すべてが正常に機能します。これは、XSLT に s が散らばっているよりもはるかに望ましい方法local-name()です。

于 2013-02-04T15:46:06.917 に答える