首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在XSD中,如何根据XML元素的一个属性值来约束其有效性?

在XSD中,如何根据XML元素的一个属性值来约束其有效性?
EN

Stack Overflow用户
提问于 2014-01-04 05:45:56
回答 1查看 110关注 0票数 2

如果我有以下XML:

代码语言:javascript
复制
<properties>
    <parameter key="number">1</parameter>
    <parameter key="letter">A</parameter>
</properties>

...and我希望“属性”的支持XSD强制所有"key“属性为"number”的“参数”标记只接受文本内容的数字,而所有带有"letter“的标记只接受字母,是否可以使用XSD来表示该约束方案?如果不是,是否可以在任何其他模式语言下执行此操作?

请注意,我当然完全知道我可以这样做:

代码语言:javascript
复制
<properties>
    <number>1</number>
    <letter>A</letter>
</properties>

...but此练习的目标是压缩比上面直接表示的更复杂的场景。

简而言之,我正在寻找一种构建基于XML的“非冗长”属性文件的方法,该文件能够处理潜在的复杂值约束,甚至包括与上面示例中的"attr“或"key”处于同一级别的属性的可能约束。

EN

回答 1

Stack Overflow用户

发布于 2014-01-08 11:07:35

对于您的问题,这将是一个非常直观的XSD1.1。它是基于type alternatives的。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xerces="http://xerces.apache.org">
    <xsd:element name="properties">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="parameter" maxOccurs="unbounded" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="parameter">
        <xsd:alternative test="@key eq 'number'" type="number"/>
        <xsd:alternative test="@key eq 'letter'" type="letter"/>
    </xsd:element>
    <xsd:complexType name="number">
        <xsd:simpleContent>
            <xsd:extension base="xsd:int">
                <xsd:attribute name="key" type="xsd:string" use="required" fixed="number"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <xsd:complexType name="letter">
        <xsd:simpleContent>
            <xsd:extension base="aletter">
                <xsd:attribute name="key" type="xsd:string" use="required" fixed="letter"/>             
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <xsd:simpleType name="aletter">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="[A-Z]"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

无效的XML,例如:

代码语言:javascript
复制
<properties>
    <parameter key="number">A</parameter>
    <parameter key="letter">1</parameter>
</properties>

将产生以下输出(我使用自己的工具QTAssistant,它使用XSD1.1的Xerces )。

加载[]时出现

错误,第2行位置42 cvc-datatype-valid.1.2.1:'A‘不是'integer’的有效值。

加载[]时出错,第2行位置42 cvc-complex-type.2.2:元素“”参数“”必须没有元素子项,并且值必须有效。“”

加载[]时出错,第3行位置42 cvc- pattern -valid:值'1‘相对于类型'aletter’的模式'A-Z‘无效。

加载[]时出错,第3行位置42 cvc-complex-type.2.2:元素'parameter‘不能有元素子项,并且值必须有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20913238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档