首页 文章

对xsd:any强制进一步限制?

提问于
浏览
1

我有一个XSD 1.0序列,它定义了一组元素,其中一些元素可以是可选的,但是它们都不会出现多次,并且也以 <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="lax"/> 标记结束,以便用户能够在其中添加自己的数据元素 . 以编程方式导出符合XML的最简单的方法(理想情况下,不需要他们定义自己的命名空间/ XSD) .

在处理用户生成的XML时,我将忽略它们通过 <any> 标记添加的任何自定义元素,但我想知道是否有办法强制执行元素名称的唯一性,以便我可以确定它们不会放置与 maxOccurs=1 序列中定义的元素重复?

这是一个示例xsd(交互式版本here):

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns="testxsd" targetNamespace="testxsd" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            elementFormDefault="qualified">
    <xsd:element name="XSDSequence">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="itemA" type="xsd:string"
                             minOccurs="1" maxOccurs="1"/>
                <xsd:element name="itemB" type="xsd:string"
                             minOccurs="0" maxOccurs="1"/>
                <xsd:element name="itemC" type="xsd:string"
                             minOccurs="1" maxOccurs="1"/>
                <xsd:any minOccurs="0" maxOccurs="unbounded" 
                         namespace="##any" processContents="lax"/>  
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

这是一个示例XML,它传递XSD验证,但由于最后重复的 <itemA> ,我想错误地输出:

<XSDSequence xmlns="testxsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <itemA>foo</itemA>
    <itemC>bar</itemC>
    <randomElement>this is ok</randomElement>
    <itemA>I want this second itemA to cause an error</itemA>
</XSDSequence>

(请注意,通过属性而不是元素捕获数据项是 not 我想要做的事情 . )

2 回答

  • 1

    不,在XSD 1.0中,一旦你允许任何元素,你就不能指定超出 minOccursmaxOccursnamespaceprocessContents 所提供的限制条件 .

    在XSD 1.1中,您还可以对 xsd:any 元素进行 xsd:assertions ;你可以用断言来表达你的约束 . [ Update :不要错过@C. M. Sperberg-McQueen's simpler idea for XSD 1.1: xsd:any/@notQName="itemA itemB itemC" ]

  • 2

    也许确保元素 itemAitemBitemC 不重复的最简单方法是使用 namespace="##other" 而不是 namespace="##any" . (这假设命名空间 testxsd 中除了这三个元素之外的元素不需要在这里出现 . )

    或者转到XSD 1.1并添加属性 notQName="itemA itemB itemC" .

相关问题