【问题标题】:Namespace for XInclude included elementsXInclude 包含元素的命名空间
【发布时间】:2013-01-10 14:39:21
【问题描述】:

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

包含后&lt;b&gt; 元素应位于哪个命名空间foo 或没有命名空间?


使用 Nokogiri 通过 XInclude 处理加载第一个文档会生成一个文本表示,这意味着 &lt;b&gt; 在父命名空间中,但检查元素声称 &lt;b&gt; 没有命名空间:

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

【问题讨论】:

    标签: ruby xml nokogiri xml-namespaces xinclude


    【解决方案1】:

    &lt;b&gt; 元素在包含后应该在哪个命名空间中,foo 还是没有命名空间?

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

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

    (我的粗体) - &lt;b&gt; 元素不在命名空间中,但其 in-scope namespaces 信息集属性不再与“虚拟”文档中的命名空间声明一致,从而导致从解决 XInclude。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 2020-05-06
      • 2023-03-12
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      相关资源
      最近更新 更多