Xpath 结果与 xs:assert 结果
Xpath result vs. xs:assert result
我正在使用 oXygen XML Editor 16.1,使用 SaxonEE 集 XML Schema 1.1 进行这些测试。
我想确保作为基本复杂类型限制的复杂类型中的元素具有相同数量的枚举。 (下面的代码)
示例 complexType(post 的底部)应该无法通过此断言:
<xs:assert test="count(//xs:element[@name='id-name']//xs:enumeration)
eq count(//xs:element[@name='issuer']//xs:enumeration)
and
count(//xs:element[@name='issuer']//xs:enumeration)
eq count(//xs:element[@name='assignor']//xs:enumeration)"></xs:assert>
因为assignor有3个枚举,其他元素有2个。无论我将它放在基本的 complexType 还是受限的 complexType 中,它仍然将限制显示为有效模式。
如果我执行这个
count(//xs:element[@name='id-name']//xs:enumeration)
eq count(//xs:element[@name='issuer']//xs:enumeration) and
count(//xs:element[@name='issuer']//xs:enumeration)
eq count(//xs:element[@name='assignor']//xs:enumeration)
在 XPath 编辑器中,它按预期失败 (returns false) ,并且在所有三个都有两个枚举时通过 (returns true) 。
样本限制:
<xs:complexType name='mytype' xml:lang='en-US'>
<xs:complexContent>
<xs:restriction base='myBaseType'>
<xs:sequence>
<xs:element maxOccurs='1' minOccurs='1' name='id-name'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='URI'></xs:enumeration>
<xs:enumeration value='ID Number'></xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element maxOccurs='1' minOccurs='1' name='issuer'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='Owner'/>
<xs:enumeration value='Owner'/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element maxOccurs='1' minOccurs='1' name='assignor'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='Owner'/>
<xs:enumeration value='Owner'/>
<xs:enumeration value='Owner'/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
'myBaseType' 在另一个模式中,在这个模式中是 'included'。该 complexType 看起来像这样:
<xs:complexType name="myBaseType">
<xs:complexContent>
<xs:extension base="someType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="id-name" type="xs:string"></xs:element>
<xs:element maxOccurs="1" minOccurs="0" name="issuer" type="xs:string"></xs:element>
<xs:element maxOccurs="1" minOccurs="0" name="assignor" type="xs:string"></xs:element>
</xs:sequence>
<xs:assert test="count(//xs:element[@name='id-name']//xs:enumeration) eq count(//xs:element[@name='issuer']//xs:enumeration) and
count(//xs:element[@name='issuer']//xs:enumeration) eq count(//xs:element[@name='assignor']//xs:enumeration)
"></xs:assert>
</xs:extension>
</xs:complexContent>
我错过了什么?我不能在限制 complexType 上建立断言,或者断言只能针对实例数据进行评估吗?在我看来,由于 'mytype' 是 'myBaseType' 的限制,因此应该应用断言。
正如您在问题结尾处预期的那样,断言的范围是由 XSD 管理的 XML 文档实例,而不是 XSD 本身。如果您想对 XSD 本身做出断言,您必须创建一个将原始 XSD 视为 XML 文档的元 xsd。
您可以从 XML Schema schema. However, you should instead consider using Schematron 断言开始,这可能更适合选择性地强制执行约束。我在 XSDs 上使用 Schematron 来执行组织约定,并发现它是检查是否符合已采用的政策的可行方法。
根据 OP 评论更新
'If you wish to make assertions about the XSD itself, you'd have to
create a meta-xsd that treated the original XSD as an XML document' --
Yes, that is what I did.
不,那不是你所做的。您正在尝试从验证您的 XML 文档实例的同一个 XSD 对 XSD 进行断言。它是通过 xsd:include
引入的单独的 XSD 这一事实没有任何改变;它仍然只是一个域 XSD,而不是域 XSD 的元 XSD。我所说的是你必须有一个元 XSD,意思是一个单独的 XSD 来验证你的域 XSD。您低估了此类任务的复杂性。如果您不是从 XML Schema 架构开始,您就没有意识到元 XSD 必须做什么。
I really prefer to not use schematron, if this can be done with XSD
1.1 then why add another element of complexity?
因为通过 Schematron 或其他一些技术强制实施点约束的复杂性实际上 低于 通过 XSD 验证所有 XSD 的复杂性然后添加一些断言来覆盖现场约束。此外,XSD 1.1 的断言设施比 Schematron 的断言受到更多限制。
我正在使用 oXygen XML Editor 16.1,使用 SaxonEE 集 XML Schema 1.1 进行这些测试。
我想确保作为基本复杂类型限制的复杂类型中的元素具有相同数量的枚举。 (下面的代码)
示例 complexType(post 的底部)应该无法通过此断言:
<xs:assert test="count(//xs:element[@name='id-name']//xs:enumeration)
eq count(//xs:element[@name='issuer']//xs:enumeration)
and
count(//xs:element[@name='issuer']//xs:enumeration)
eq count(//xs:element[@name='assignor']//xs:enumeration)"></xs:assert>
因为assignor有3个枚举,其他元素有2个。无论我将它放在基本的 complexType 还是受限的 complexType 中,它仍然将限制显示为有效模式。
如果我执行这个
count(//xs:element[@name='id-name']//xs:enumeration)
eq count(//xs:element[@name='issuer']//xs:enumeration) and
count(//xs:element[@name='issuer']//xs:enumeration)
eq count(//xs:element[@name='assignor']//xs:enumeration)
在 XPath 编辑器中,它按预期失败 (returns false) ,并且在所有三个都有两个枚举时通过 (returns true) 。
样本限制:
<xs:complexType name='mytype' xml:lang='en-US'>
<xs:complexContent>
<xs:restriction base='myBaseType'>
<xs:sequence>
<xs:element maxOccurs='1' minOccurs='1' name='id-name'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='URI'></xs:enumeration>
<xs:enumeration value='ID Number'></xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element maxOccurs='1' minOccurs='1' name='issuer'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='Owner'/>
<xs:enumeration value='Owner'/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element maxOccurs='1' minOccurs='1' name='assignor'>
<xs:simpleType>
<xs:restriction base='xs:string'>
<xs:enumeration value='Owner'/>
<xs:enumeration value='Owner'/>
<xs:enumeration value='Owner'/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
'myBaseType' 在另一个模式中,在这个模式中是 'included'。该 complexType 看起来像这样:
<xs:complexType name="myBaseType">
<xs:complexContent>
<xs:extension base="someType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="id-name" type="xs:string"></xs:element>
<xs:element maxOccurs="1" minOccurs="0" name="issuer" type="xs:string"></xs:element>
<xs:element maxOccurs="1" minOccurs="0" name="assignor" type="xs:string"></xs:element>
</xs:sequence>
<xs:assert test="count(//xs:element[@name='id-name']//xs:enumeration) eq count(//xs:element[@name='issuer']//xs:enumeration) and
count(//xs:element[@name='issuer']//xs:enumeration) eq count(//xs:element[@name='assignor']//xs:enumeration)
"></xs:assert>
</xs:extension>
</xs:complexContent>
我错过了什么?我不能在限制 complexType 上建立断言,或者断言只能针对实例数据进行评估吗?在我看来,由于 'mytype' 是 'myBaseType' 的限制,因此应该应用断言。
正如您在问题结尾处预期的那样,断言的范围是由 XSD 管理的 XML 文档实例,而不是 XSD 本身。如果您想对 XSD 本身做出断言,您必须创建一个将原始 XSD 视为 XML 文档的元 xsd。
您可以从 XML Schema schema. However, you should instead consider using Schematron 断言开始,这可能更适合选择性地强制执行约束。我在 XSDs 上使用 Schematron 来执行组织约定,并发现它是检查是否符合已采用的政策的可行方法。
根据 OP 评论更新
'If you wish to make assertions about the XSD itself, you'd have to create a meta-xsd that treated the original XSD as an XML document' -- Yes, that is what I did.
不,那不是你所做的。您正在尝试从验证您的 XML 文档实例的同一个 XSD 对 XSD 进行断言。它是通过 xsd:include
引入的单独的 XSD 这一事实没有任何改变;它仍然只是一个域 XSD,而不是域 XSD 的元 XSD。我所说的是你必须有一个元 XSD,意思是一个单独的 XSD 来验证你的域 XSD。您低估了此类任务的复杂性。如果您不是从 XML Schema 架构开始,您就没有意识到元 XSD 必须做什么。
I really prefer to not use schematron, if this can be done with XSD 1.1 then why add another element of complexity?
因为通过 Schematron 或其他一些技术强制实施点约束的复杂性实际上 低于 通过 XSD 验证所有 XSD 的复杂性然后添加一些断言来覆盖现场约束。此外,XSD 1.1 的断言设施比 Schematron 的断言受到更多限制。