XInclude的命名空间包含元素

时间:2013-01-26 22:02:23

标签: ruby xml nokogiri xml-namespaces xinclude

考虑这两个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

1 个答案:

答案 0 :(得分:3)

  

在包含,foo或没有名称空间后,<b>元素应该包含哪些名称空间?

没有命名空间。 XInclude在信息集级别运行,并保留所包含内容的信息集属性。 infoset specification明确指出

  

对应于真实文档的信息集必须以各种方式保持一致;例如,元素的[范围内命名空间]属性将与元素及其祖先的[命名空间属性]属性一致。 通过其他方式构建的信息集可能不是这样;在这种情况下,将不存在与信息集相对应的XML文档,并且序列化它将需要解决不一致性(例如,通过输出与范围中的命名空间相对应的命名空间声明)。

(我的粗体) - <b>元素不在命名空间中,但其范围内命名空间信息集属性不再与“虚拟”文档中的命名空间声明一致这是解决XInclude的结果。