1

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

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

4

1 回答 1

2

这是一个更新的 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 需要如上所述的命名空间前缀声明。

于 2013-05-02T14:08:33.450 回答