2

我有一个 XSD 文件,我在其中定义了一个受此类枚举限制的简单类型。

<xs:simpleType name="myEnumStrings">
    <xs:restriction base="xs:string">
        <xs:enumeration value="first"/>
        <xs:enumeration value="second"/>
        ...
        <xs:enumeration value="last"/>
    </xs:restriction>
</xs:simpleType>

我有第二种简单类型,它的值取决于 myEnumStrings 的可能值,这种复杂的方式我只能用一种模式来描述。

<xs:simpleType name="patternRestrictedType">
    <xs:restriction base="xs:string">
        <xs:pattern value="..."/>
    </xs:restriction>
</xs:simpleType>

目前我正在使用字符串复制正则表达式中的信息

(first|second|...|last)

每当我想引用 myEnumStrings 时。虽然这是一个麻烦制造者和错误的来源,因为当我修改 myEnumStrings 类型时,我需要使所有正则表达式保持最新。

有没有办法在正则表达式中引用 myEnumStrings 的可能值以避免这种重复?如果这是不可能的,有没有办法全局定义要在正则表达式中重用的字符串(first|second|...|last),以限制仅在两个地方重复并使正则表达式更具可读性?

4

1 回答 1

2

XSD 不擅长它,如“优雅”。唯一可能有帮助的是使用工会;它可以根据您的特定模式工作,但它可能无法根据您未描述的其他内容工作。

这个想法是重用枚举。为此,您创建简单的类型来封装您希望重用的枚举。只是一个观察,具有多个枚举值在技术上等同于其值的析取(就模式而言)。

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:simpleType name="myEnumStrings-1">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="first"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="myEnumStrings-2">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="second"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="myEnumStrings-n">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="last"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="myEnumStrings">
        <xsd:union memberTypes="myEnumStrings-1 myEnumStrings-2 myEnumStrings-n"/>
    </xsd:simpleType>

    <xsd:simpleType name="patternRestrictedType">
        <xsd:union memberTypes="myEnumStrings-1 myEnumStrings-2"/>
    </xsd:simpleType>

    <xsd:element name="root-a" type="myEnumStrings"/>
    <xsd:element name="root-b" type="patternRestrictedType"/>
</xsd:schema>

以上实现了枚举的重用,或者您定义为联合成员约束的任何其他内容。

root-a 的有效 XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root-a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">last</root-a>

root-b 的有效 XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root-b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">second</root-b>

虽然 root-b 的内容适用于 root-a,但反之则不然。

正如我所说,当您想到大系列时,可能并不那么优雅;但是,它应该严格回答我认为您提出的问题,并可能为您提供其他方法的指示。

于 2012-06-07T11:16:52.710 回答