我正在玩一些嵌入在 XSD 文件中的 schematron 规则。该示例是规范示例之一,它在不涉及名称空间的情况下有效,但是当我引入名称空间时,它会停止验证,我不知道为什么。
架构很简单:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://me.com/ns" xmlns:q="http://me.com/ns">
<xs:element name="socket">
<xs:annotation>
<xs:appinfo>
<sch:pattern name="Mutually exclusive attributes on the socket element"
xmlns:sch="http://purl.oclc.org/dsdl/schematron">
<sch:rule context="socket" >
<sch:assert test="@hostName and @hostAddress">On a socket element only one
of the attributes hostName and hostAddress are allowed, not
both.</sch:assert>
</sch:rule>
</sch:pattern>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:attribute name="hostName" type="xs:string" use="optional"/>
<xs:attribute name="hostAddress" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
</xs:schema>
并且正在验证的文件是:
<?xml version="1.0" encoding="UTF-8"?>
<socket xmlns="http://me.com/ns" hostAddress="192.168.200.76"/>
删除命名空间时会触发 schematron 断言,但如上所示,它们不会。我尝试在上下文中引用命名空间<sch:rule context="q:socket">
,但随后我从 schematron 管道中得到编译错误。
有谁知道如何解决这个问题?