我正在玩一些嵌入在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管道中获得了编译错误。
有谁知道如何解决这个问题?
答案 0 :(得分:1)
这是一个可以使用的更新XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://me.com/ns" targetNamespace="http://me.com/ns" xmlns:sch="http://purl.oclc.org/dsdl/schematron">
<xs:annotation>
<xs:appinfo>
<sch:ns uri="http://me.com/ns" prefix="q"/>
</xs:appinfo>
</xs:annotation>
<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="q: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>
Schematron需要如上所示的名称空间前缀声明。