2

次の2つのXMLドキュメントについて考えてみます。

a.xml

<a xmlns="foo" xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="b.xml" parse="xml" />
</a>

b.xml

<b>Hi Mom!</b>

<b>要素を含めた後、fooまたは名前空間なしで、要素はどの名前空間に含める必要がありますか?


Nokogiriを使用してXInclude処理で最初のドキュメントをロードすると、それ<b>が親名前空間にあることを意味するテキスト表現が生成されますが、要素を検査すると、名前空間がないと主張し<b>ます。

require 'nokogiri'

d = Nokogiri.XML(IO.read('a.xml'),&:xinclude)
puts d
#=> <?xml version="1.0"?>
#=> <a xmlns="foo" xmlns:xi="http://www.w3.org/2001/XInclude">
#=>     <b>Hi Mom!</b>
#=> </a>

p d.root.namespace
#=> #<Nokogiri::XML::Namespace:0x3fd40c517de8 href="foo">

p d.root.elements.first.namespace
#=> nil
4

1 に答える 1

3

要素を含めた後、要素はどの名前空間にあるべき<b>ですか? foo または名前空間なし?

名前空間はありません。XInclude は情報セット レベルで動作し、含まれるコンテンツの情報セット プロパティを保持します。infoset 仕様は、明示的に次の点を指摘しています。

実際の文書に対応する情報セットは、必然的にさまざまな点で一貫性があります。たとえば、要素の [スコープ内の名前空間] プロパティは、要素とその祖先の [名前空間属性] プロパティと一致します。これは、他の手段で構築された情報セットには当てはまらない場合があります。このような場合、情報セットに対応する XML ドキュメントは存在せず、シリアル化するには、矛盾を解決する必要があります (たとえば、スコープ内の名前空間に対応する名前空間宣言を出力することによって)。

(私の太字) -<b>要素は名前空間にありませんが、そのスコープ内の名前空間の情報セット プロパティは、XInclude を解決した結果の「仮想」ドキュメント内の名前空間宣言と一致しなくなりました。

于 2013-01-26T22:21:30.520 に答える