我正在尝试理解XML中命名空间的工作原理。当我有一个像foo:bar这样的元素时,属性通常不会有命名空间。但有时会有。即使声明了默认命名空间,属性也属于元素的命名空间吗?从xhtml的xsd中查看,似乎属性是模式的一部分,应该在xhtml的命名空间中,但它们从未以这种方式呈现...
我正在尝试理解XML中命名空间的工作原理。当我有一个像foo:bar这样的元素时,属性通常不会有命名空间。但有时会有。即使声明了默认命名空间,属性也属于元素的命名空间吗?从xhtml的xsd中查看,似乎属性是模式的一部分,应该在xhtml的命名空间中,但它们从未以这种方式呈现...
<schema attributeFormDefault="qualified">
),可以声明您的属性属于一个命名空间,即使您使用默认命名空间,在您的文档中也强制您为其添加前缀。XML 1.1中的命名空间(第二版)指出:“未加前缀的属性名称的命名空间名称始终没有值”,并且“未加前缀的属性的解释取决于它们所在的元素”
以下是使用Clark符号表示法来说明这一点的示例,其中命名空间前缀用花括号中的命名空间URL替代:
<bar xmlns:foo="http://www.example.com/"
foo:baz="baz"
qux="qux"/>
<bar xmlns="http://www.example.com/" xmlns:foo="http://www.example.com/"
foo:baz="baz"
qux="qux"/>
<foo:bar xmlns="http://www.example.com/" xmlns:foo="http://www.example.com/"
foo:baz="baz"
qux="qux"/>
是
<{}bar
{http://www.example.com/}baz="baz"
{}qux="qux"/>
<{http://www.example.com/}bar
{http://www.example.com/}baz="baz"
{}qux="qux"/>
<{http://www.example.com/}bar
{http://www.example.com/}baz="baz"
{}qux="qux"/>
qux
属性为什么没有继承元素的默认命名空间 http://www.foo.com/
,你该如何解释? - dma_k今天在处理XSD时,有关属性和命名空间的问题让我花了一些时间才理解。在此,我将与大家分享这个经验,以防其他人也遇到同样的问题。
我正在处理的模式文档中,有几个全局属性被某些元素引用。简化起见,假设我所说的这个XSD是关于一个客户的。
让我们称其中一个全局属性为Id。使用它的根元素为Customer。
我的XSD声明如下:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://schemas.mycompany.com/Customer/V1"
targetNamespace="http://schemas.mycompany.com/Customer/V1"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
我的Id属性声明看起来像这样:
<xs:attribute name="Id" type="xs:positiveInteger"/>
我的客户元素使用了以下属性:
<xs:element name="Customer">
<xs:complexType>
<xs:attribute ref="Id" use="required"/>
<!-- some elements here -->
</xs:complexType>
</xs:element>
现在,假设我想声明一个像下面这样的客户(Customer) XML文档:
<?xml version="1.0" encoding="utf-8"?>
<Customer Id="1" xmlns="http://schemas.mycompany.com/Customer/V1">
<!-- ... other elements here -->
</Customer>
我发现当属性被全局声明时,它的命名空间与引用它的元素不在同一个命名空间中。
我想出了唯一的解决方案:像这样两次声明命名空间:一次不带前缀,使其成为元素的默认命名空间,另一次带有前缀,以便在属性中使用。因此,它应该看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Customer cus:Id="1" xmlns="http://schemas.mycompany.com/Customer/V1"
xmlns:cus="http://schemas.mycompany.com/Customer/V1">
<!-- ... other elements here -->
</Customer>
这种做法非常不实用,所以我决定摆脱所有的全局属性并将它们声明为本地属性。在我给出的示例中,这样做会像这样:
这么做非常不切实际,所以我决定摆脱所有的全局属性,将它们声明为本地属性。在我给出的示例中,这样看起来:
<xs:element name="Customer">
<xs:complexType>
<xs:attribute name="Id" type="xs:positiveInteger" use="required"/>
<!-- some elements here -->
</xs:complexType>
</xs:element>
在网上很难找到关于我所谈论的内容的一些参考资料。最终我在Stylus XSD论坛中找到了这篇文章,其中一个叫Steen Lehmann的人建议要么将属性局部声明,要么在属性组内声明它以使属性声明不再是全局的。
"这样属性声明本身就不再是全局的"
这个最后的解决方案有点“hacky”,所以我决定坚持第一种解决方案并将所有属性都声明为局部的。
<a>
是指foo:a
还是上下文中的默认命名空间。我认为它不是指foo:a
,而是文档的默认命名空间a。考虑至少这个引用: