给出了几个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
?如果是这样,人们可以在哪里找到这些惯例?如果没有,那么解决这些名称空间的是什么?
答案 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)。
ref
和type
属性的情况(引用上述链接的架构架构):
<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引导自己的方式。