2

渡されたコードの一部によって生成されたXMLのXMLスキーマを作成しようとしています。問題の簡略版について説明します。このコードによって生成されたXMLファイルがテキストドキュメントを記述しているとしましょう。次のようになります。

<document>
  <r1>A line of text</r1>
  <r2 style="bold">Another line which is bold</r2>
  <r3>Yet another line</r3>
</document>

等々。最良の設計ではありません。行番号が属性である方がよいと思いますが、それを処理する必要があります。そして、それは問題である行番号を表しています。要素名に正規表現(または同様のもの)を指定できるスキーマを作成する方法はありますか?XSDファイルは次のようになると思います。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/SimpleSchema" 
        xmlns:tns="http://www.example.org/SimpleSchema" 
        elementFormDefault="qualified">
    <xs:element name="document">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="rX" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="style" type="xs:string" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
 </xs:schema>

...ここで、9行目の「rX」は、「rで始まりXで終わる名前(整数)」を意味するために必要な式です。

生成するコードを自分で修正する必要はないので、最初に適切なXMLスキーマを作成できるかどうかを確認したいと思います。みなさん、よろしくお願いします。

4

3 に答える 3

6

XSDでは、要素名を文字通りに指定する必要があります。あなたが念頭に置いているような宣言はサポートされていません。

あなたがそれを説明したように(rで始まり、整数であるXで終わる名前)、あなたが書きたい宣言は、スキーマ内に無限の数の要素コンポーネントを生成します。この種のことをサポートする私が知っている唯一の文法形式は、AardvanWijngaardenがAlgol68のために開発した2レベルの文法です。

したがって、短期的には、生成するコードを変更するか、目的の宣言に対して独自の表記法を考案し、そこから正当なXSDスキーマドキュメントを生成するのが最善の選択肢のように思われます。

于 2012-12-18T16:15:44.360 に答える
4

XSD 1.1では、xs:anyを使用して任意の名前の要素を許可し、アサーションを使用して名前を正規表現に一致するものに制限できます。

    <xs:complexType>
        <xs:sequence>
            <xs:any minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:assertion test="every $x in * 
                            satisfies matches(local-name($x), '[Rr][0-9]+')"/>
    </xs:complexType> 

XSD 1.1は現在、Xerces(ベータ版)とSaxon(9.4)で実装されています。

于 2012-12-19T08:35:34.660 に答える
0

私はXSDファイルの正規表現機能にそれほど精通していませんが、式自体はかなり単純です。

これにより、「rX」行番号が取得されます。

<([Rr][0-9]{1,})>

キャプチャグループを利用できない場合は、これを使用できます。

[Rr][0-9]{1,}
于 2012-12-18T15:06:44.410 に答える