嵌入式schematron无法在具有命名空间的XML文档中工作

时间:2013-05-02 09:03:41

标签: xml validation xsd schematron

我正在玩一些嵌入在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管道中获得了编译错误。

有谁知道如何解决这个问题?

1 个答案:

答案 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需要如上所示的名称空间前缀声明。