xsd架构ref和类型属性值的名称空间是如何别名/绑定的?

时间:2017-06-08 09:12:01

标签: xml firefox xsd namespaces

给出了几个XSD定义示例:

http://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd

https://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd

两个XSD文档都定义了在同一文档中自引用其他定义的元素,属性,属性组和/或类型。在第一种情况下,这些类型似乎使用saml命名空间别名/绑定进行命名空间。例如:

<attributeGroup ref="saml:IDNameQualifiers"/>

并且在第二种情况下,它们使用ds命名空间别名/绑定进行命名空间。例如:

<element ref="ds:SignedInfo"/>

但是,在Firefox中查看任一文档时,我无法在任何文档中看到这些命名空间别名或绑定的定义。

第一个文档的根元素提供targetNamespace属性:

targetNamespace="urn:oasis:names:tc:SAML:2.0:assertion"

和第二个一样:

targetNamespace="http://www.w3.org/2000/09/xmldsig#"

但只是惯例是将第一个别名为saml,将第二个别名为ds?如果是这样,人们可以在哪里找到这些惯例?如果没有,那么解决这些名称空间的是什么?

1 个答案:

答案 0 :(得分:1)

命名空间绑定在具有xmlns:属性的模式的根元素中定义(作为最佳实践):

SAML的架构的断言2.0.XSD

<schema
  xmlns="http://www.w3.org/2001/XMLSchema" 
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
  [...]
  targetNamespace="urn:oasis:names:tc:SAML:2.0:assertion"
  [...]>

XMLDSIG核-schema.xsd

<schema
  xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
  targetNamespace="http://www.w3.org/2000/09/xmldsig#"
  [...]>

这些绑定不仅适用于元素和属性名称(在模式中,也是XML文档,它们主要位于XML Schema名称空间或没有名称空间中),还适用于属性值。在关联模式中声明为QNames (在本例中为the XML Schema Schema)。

reftype属性的情况(引用上述链接的架构架构):

<xs:attribute name="ref" type="xs:QName"/>
<xs:attribute name="type" type="xs:QName"/>
<!-- observe how the declaration for the type attribute uses itself! -->

这就是为什么在任何引用其自己的元素/属性/类型声明且具有目标命名空间的模式中,此目标命名空间需要绑定到前缀(或默认值)以供{{{ 1}}和ref属性值。

简而言之,理解这里涉及的机制的关键思想是暂时忘记两个 .xsd 文档是模式,并将其视为任何其他XML文档对XML Schema Schema有效。还有更多:XML Schema Schema也是一个XML文档,它对...本身有效。这就是XML Schema引导自己的方式。