声明源为参数实体替换文本时XML中相对URI的行为

声明源为参数实体替换文本时XML中相对URI的行为,xml,xml-parsing,specifications,dtd,Xml,Xml Parsing,Specifications,Dtd,我试图理解相对系统ID URI的正确行为。首先,让我引用规范: 4.2.2外部实体 [……] [发生实体声明的资源的位置]被定义为包含'Ouf'的外部实体,这是一个角案例。我想我们可以同意,你在哪里提到%baz并不重要;从…起我很确定其意图是“relative”应该是指“相对于声明出现的文件”。因为我们很少听到关于一个XML处理器和另一个XML处理器之间互操作的抱怨(耶),我打赌它们都做同样的事情,我希望这就是事实。但我还没有测试 好问题 与我尊敬的联合编辑不同,我不认为这是一个极端情况 全部的

我试图理解相对系统ID URI的正确行为。首先,让我引用规范:

4.2.2外部实体

[……]


[发生实体声明的资源的位置]被定义为包含'Ouf'的外部实体,这是一个角案例。我想我们可以同意,你在哪里提到%baz并不重要;从…起我很确定其意图是“relative”应该是指“相对于声明出现的文件”。因为我们很少听到关于一个XML处理器和另一个XML处理器之间互操作的抱怨(耶),我打赌它们都做同样的事情,我希望这就是事实。但我还没有测试

好问题

与我尊敬的联合编辑不同,我不认为这是一个极端情况 全部的许多公共DTD都实例化了这种模式。但我确实认为 在像这样的正常情况下,大多数XML解析器都会得到正确的结果 回答

首先,一些一般性的观点

1解决相对参考的一般原则 基本URI大致上是指通常计数的基本URI是 使用相对引用的资源的基本URI

2 XML规范的工作是说明它对亲属意味着什么 在实体声明中找到的要在相关实体中“使用”的资源 以及在何处查找适当的基URI。规格是 答案在你引用的文章中给出。这等于说 参数实体声明时使用相对引用 包含它的将被解析为参数实体声明,而不是在 在其他时间,要使用的基本URI是 PE声明发生在其中的实体

3由于您观察到PE引用是递归展开的,因此 在系统中的任意给定点展开的PE引用集合 解析由堆栈建模。任何给定相对值的基URI reference是堆栈顶部的外部实体的URI 当解析包含该相对引用的声明时

我将沉默地讨论什么样的实体的细节 参考资料是在什么时候处理的,以及 细节;简短的无动机回答是,当PE引用 如果在声明的替换文本中找到,则 立即扩大;遇到常规实体引用时 (可能在另一实体的替换文本中),它们是 不扩大,;当遇到以下情况时,将对其进行扩展: 分析文档实例,但在分析DTD时不进行分析

首先,我们的文件。这可能在任何地方,因为外部 它引用的DTD使用系统ID的绝对URL

FILE: doc.xml

    <!DOCTYPE foo SYSTEM "http://dotcom.xml/foo.dtd">
    ...
文件:doc.xml

当我们开始处理这个文件时,表单的一个条目

  • #文档
    “file://Users/semicolon/docs/doc.xml"
被推送到实体堆栈上,以及任何 决议是“file://Users/semicolon/docs/doc.xml“

XML格式良好规则的一个结果是 读取完该实体后,堆栈变为空,XML 文件结束了

    <!DOCTYPE foo SYSTEM "http://dotcom.xml/foo.dtd">
    ...
仍然没有什么模棱两可的。很明显,我们的下一个资源是 在

好吧,取决于你所说的“下一步”是什么意思,这要么是真的,要么是真的 错。如果你的意思是“在我们处理之后,我们 然后处理,“然后它是假的。这个 文件…/bar.ent是在处理…/foo.dtd期间处理的, 以后不要了。如果您的意思是“下一个要推送到实体上的实体” 堆栈是PE的“条”,那么它是真的

如果显示的两行是文件“foo.dtd”的开头,则 之后是进一步的声明,必须对PE“bar”进行解析并 在下列声明之前处理。即使没有 遵循PE参考%bar;但严格来说,是空白还是EOF 应处理外部参数实体“bar” 当对它的引用被识别时,以及 遇到以下EOF

但我同意相对参考的正确分辨率是 您指定的绝对引用

文件:

一旦我们开始读取此实体,实体堆栈为:

  • bar
    “”
  • #dtd外部
    “”
  • #文档
    “file://Users/semicolon/docs/doc.xml"
解析的基本URI是
http://dotcom.xml/bar/bar.ent

FILE: http://dotcom.xml/bar/bar.ent

    <!ENTITY % baz SYSTEM "baz/baz.ent">
    %baz;
    <!ENTITY % baz SYSTEM "baz/baz.ent">
    %baz;
我阅读说明书时告诉我们,相对参考 “chapters.dtd”是相对于B的基URI,而不是相对于A的基URI

看到几年前我得出了同样的结论,我感到欣慰 虽然我在做这个项目 在这种情况下,on做了错误的事情)

所以我想了解两件事:

上面,什么是“baz/baz.ent”的正确绝对URL

a。如果是,为什么规范 说“在它被解析的地方”

是的

规范说明了它在尝试中所做的事情(显然不是 完全成功)以明确相关的基本URI是 包含声明D的实体E的声明,声明D包含 相对参考文献R与“baz/baz.ent”

略显笨拙的措辞也试图(我认为)说: 在异常(或病理)病例中,如上述A/B病例,其中 看起来像PE声明的实际字符串出现在一个实体中 解析规则说它被识别并作为PE处理 在另一个实体中声明,它是后一个实体(在 示例)使用的是其基本URI,而不是包含字符串的URI (A) 。A包含一个看起来像声明的字符串;B包含 (通过“chapdecl”的扩展)声明。(严格地说 也就是说,当声明为 遇到的是'c'
    <!DOCTYPE foo SYSTEM "http://dotcom.xml/foo.dtd">
    ...
    <!ENTITY % bar SYSTEM "bar/bar.ent">
    %bar;
    <!ENTITY % baz SYSTEM "baz/baz.ent">
    %baz;
    <!ENTITY % bar SYSTEM "bar/bar.ent">
    %bar;
    %baz;
   <!ENTITY % baz SYSTEM "baz/baz.ent">
<!ENTITY % chapdecl '&#x003C;!ENTITY % chapters SYSTEM "chapters.dtd">'>  
%chapdecl;