2

考虑以下两个 XML 文档:

一个.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 在信息集级别运行并保留包含内容的信息集属性。信息集规范明确指出

一个真实文档对应的信息集必然会在各种方面保持一致;例如,元素的 [in-scope namespaces] 属性将与元素及其祖先的 [namespace attributes] 属性一致。这可能不适用于通过其他方式构建的信息集;在这种情况下,将没有与信息集相对应的 XML 文档,并且要对其进行序列化,就需要解决不一致的问题(例如,通过输出与范围内的命名空间相对应的命名空间声明)。

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

于 2013-01-26T22:21:30.520 回答