我有一个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时。这虽然是一个麻烦制造者和bug的来源,因为我需要在修改myEnumStrings类型时保持所有正则表达式为最新。
有没有办法在正则表达式中引用myEnumStrings的可能值来避免这种重复?如果这是不可能的,有没有办法定义globaly在正则表达式中重用的字符串(first | second | ... | last),以限制仅在两个位置的重复并使正则表达式更具可读性?
答案 0 :(得分: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,但反之则不然。
正如我所说,当你想到大集时,也许不那么优雅;但是,应该严格回答我的想法,并指出其他方法。