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