4

いくつかのXMLファイルを検証するためにrelaxNGスキーマを作成しています。ほとんどの要素には、いくつかの必須属性があり、このXMLスキーマのインスタンスによって追加の属性が追加される場合もあります。

たとえば、有効なドキュメントは次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:param="some-uri#params">
   <someElement
        param:requiredAttribute1="foo" 
        param:requiredAttribute2="bar"
        param:freeExtraParam="toto"
        param:freeExtraParam="titi" />
</root>

私のRelaxNGスキーマでは、次のように表現しています。

<?xml version="1.0" encoding="utf-8" ?>
<grammar 
    xmlns="http://relaxng.org/ns/structure/1.0" 
    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    <start>
        <element name="someElement" >
            <attribute name="requiredAttribute1" />
            <attribute name="requiredAttribute2" />

            <!-- Any extra param --> 
            <zeroOrMore>
                <attribute>
                    <nsName ns="some-uri#params" />
                </attribute>
            </zeroOrMore>
        </element>
    </start>
</grammar>

ただし、jingを使用してドキュメントを検証しようとすると、スキーマが無効であると文句を言います。

 error: duplicate attribute "requiredAttribute1" from namespace "some-uri#params"

これは、 requiredAttribute1も「任意の属性」ルールに一致するためだと思います。これを行うための正しい方法は何ですか?

よろしくお願いします、ラファエル

4

1 に答える 1

2

最初のポイント:要素startは、XMLのルート要素を定義する場所です。この開始要素に属性を含めることはできません。

あなたの属性に関して:次のスキーマを使用すると、exceptあなたの答えになるはずです:

<grammar 
    xmlns="http://relaxng.org/ns/structure/1.0" 
    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    <start>
        <element name="root">
            <ref name="someElement"/>
        </element>
    </start>
    <define name="someElement">
        <element name="someElement">
            <zeroOrMore>                
                <attribute ns="some-uri#params">
                    <anyName>
                        <except>
                            <name>requiredAttribute1</name>
                            <name>requiredAttribute2</name>
                        </except>
                    </anyName>
                </attribute>
            </zeroOrMore>
            <attribute ns="some-uri#params" name="requiredAttribute1"/>
            <attribute ns="some-uri#params" name="requiredAttribute2"/>
        </element>
    </define>
</grammar>
于 2011-11-30T18:12:17.957 に答える