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>

2番目の単純な型があり、その値は、パターンでのみ記述できる複雑な方法で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)をグローバルに定義し、2箇所での重複を制限し、正規表現を読みやすくする方法はありますか? ?

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 に答える