xsd - 在正则表达式中使用枚举限制类型

标签 xsd

我有一个 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),以限制仅在两个位置重复并使正则表达式更具可读性?

最佳答案

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,但反之则不然。

正如我所说,当你考虑大集合时,也许没那么优雅;但是,它应该严格回答我认为您提出的问题,并可能为您提供其他方法的指导。

关于xsd - 在正则表达式中使用枚举限制类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10929446/

相关文章:

c# - 呈现 xml 验证错误

java - 使用 JAXB 或 XML DOM 对象时 Spring Web 服务返回不同的结果

xml - XMlSchema 中的扩展,如何?

xslt - 如何使用 XSLT 从 XSD 生成简单文档

基于XSD的WPF表单

java - 什么可以改变Java生成的XML文件中元素属性的顺序?

xsd - 为什么扩展只能放在 simpleContent 和 complexContent 容器中?

jquery - 使用 JS/jQuery 针对 xsd 验证 xml

xml - <any> 在 XSD 中不起作用?

java - jaxb:xsd 到 java,可以具有其他两个元素之一的父元素