XML名称空间在xsi:type属性中的非限定名称属于哪个?

时间:2013-11-27 14:41:44

标签: xml xml-parsing xsd xml-namespaces

我有以下xml片段:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns="hxxp://foo" 
      xmlns:xsi="hxxp://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="hxxp://www.w3.org/2001/XMLSchema">
 <Child xsi:type="SomeType" xmlns="hxxp://bar">
  ...
 </Child>
</Root>

现在的问题是:SomeType是否属于hxxp:// foo或hxxp:// bar?

我试图了解http://www.w3.org/TR/REC-xml-names/http://www.w3.org/TR/xmlschema-1/,但我不确定如何解释这个定义。

3 个答案:

答案 0 :(得分:3)

简短回答:我相信,你问的是,在你的例子中,作为xsi:type的值给出的名称SomeType是否会被视为扩展名{hxxp:// foo SomeType或扩展名{hxxp:// bar} SomeType。

(我可能错了;其他答案似乎相信你在问一个具有非限定名称的属性的命名空间。也许他们把“类型属性的不合格内容”称为“节点类型的节点” 'attribute'具有非限定名称“而不是”作为type属性的值给出的非限定QName。)

在您的示例中,SomeType将被解释为{hxxp:// bar} SomeType,因为在文档中出现属性值规范xsi:type =“SomeType”时,默认命名空间为hxxp:/ /酒吧。

<强>详细信息:

XSD 1.0中的相关规则是:第一,第3.3.4节“元素声明验证规则”中Validation Rule: Schema-Validity Assessment (Element)的第1.2.1.2节,可以这样解释:

  • 如果元素具有xsi:type属性,则
  • 其值是合法的QName,
  • QName命名架构中可用的类型,
  • 该类型有效地从期望类型派生,然后
  • 该类型用于验证元素。

第三个项目符号中QName(如果有的话)命名的类型的决定是根据3.15.3节中的Schema Representation Constraint: QName Interpretation做出的,基本上用几个音节的单词说明决定用QName表示扩展名称。

XSD 1.1中的规则指定了相同的行为,可能稍微容易理解。在那里,关键规则是governing type definitioninstance-specified type definition的定义。

答案 1 :(得分:2)

命名空间规范本身在这个问题上是矛盾的。但是在我所知道的每个具体API中,无论是XPath,XSLT,XQuery还是DOM,他们所采用的解释都是没有前缀的属性没有命名空间。它们不在默认命名空间中。

(这有时以“null命名空间”的形式表示,但这错误地表明存在一些具有null属性的命名空间,而命名空间规范坚持认为名称的集合在没有命名空间不构成这样的命名空间。)

答案 2 :(得分:-1)

(忽略这个回复 - 我误解了这个问题,对不起!)

因为它具有显式名称空间前缀(“xsi:”),所以其值为“SomeType”的属性位于该名称空间中(后者又被声明为映射到XML模式实例名称空间) )。

如果从“xsi:type”中取出“xsi:”前缀,那么它将使用当时有效的默认命名空间。根据XML命名空间规范的第6.2节:

The scope of a default namespace declaration extends from the beginning of the
start-tag in which it appears to the end of the corresponding end-tag, 
excluding the scope of any inner default namespace declarations. In the case 
of an empty tag, the scope is the tag itself.

因此,在这种情况下,范围内的默认命名空间将是hxxp:// bar

名称空间不是很有趣吗?