1

属性の名前空間と、そのような属性を XML スキーマで宣言する方法について質問があります。

属性に名前空間を使用したいのは、XML DSig を使用し、署名部分を「ID」属性で指定する必要があるためです。

ID を指定する属性の名前には任意の名前を付けることができ、可能な選択肢は「ID」、「Id」、または「id」です。

ただし、「ID」などではなく、「xml:id」を使用することを推奨しているようです。

これは、たとえば次のページで説明されています: http://www.w3.org/TR/xml-id/

これは、DSig 署名ではうまく機能します。C++ アプリケーションで署名/検証に「xmlsec1」を使用していますが、署名と署名の検証を行うことができます。

XML ファイルでは、id は次のように指定されます。

<elm:MyElement xml:id="MyName" OtherAttribute="SomeValue">

「xml:id」は名前空間の属性であり、合法的な XML ではありますが、めったに使用されないことに注意してください。ただし、XML ファイルは Xerces を使用してスキーマに対しても検証する必要がありますが、いくつか問題があります。

問題は、Xerces-C の問題ではなく、スキーマを正しく指定していないことだと思われます。

次のようなスキームで、属性名を「xml:id」として指定しようとしました。

                    <xs:attribute name="xml:id" use="required">
                            <xs:simpleType>
                               <xs:restriction base="xs:string">
                                  <xs:enumeration value="MyName"/>
                               </xs:restriction>
                            </xs:simpleType>
                    </xs:attribute>

ただし、ドキュメントを検証しようとすると、次のエラー メッセージが表示されます。

Error at file XMLParserInput, line 1, char 441
  Message: attribute '{http://www.w3.org/XML/1998/namespace}id' is not
declared for element 'Routing'

私の XML ドキュメントには「xml:id」属性がありますが、Xerces バリデーターは、この属性がスキーマに従って宣言されていると認識していないようです。

私の質問は、「xml:id」を受け入れるように XML スキーマをどのように記述すればよいかということです。

私はネットで検索しましたが、いくつかのヒントがありました。たとえば、次のとおりです。

http://xsd.stylusstudio.com/2004Oct/post01004.htm

しかし、私の XML スキーマはより複雑で、いくつかの xsd ファイルと複数の名前空間で構成されているため、Xerces で検証することはできませんでした。

私の XML ファイルは、次のようなものを宣言しています。

<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:qwerty="
http://www.mycompany.se/qwert" xmlns:abcd="http://www.mycompany.se/abcd">

スキーマ ファイルは、次のような情報を宣言します。

<xs:schema xmlns:abcd="http://www.mycompany.se/abcd" xmlns:xs="
http://www.w3.org/2001/XMLSchema"  targetNamespace="http://www.mycompany.se/abcd"

elementFormDefault="修飾済み" attributeFormDefault="無修飾">

xml:id を使用して XML ファイルを検証するために XML スキーマを宣言する方法を教えてください。

よろしく/ミカエル

4

1 に答える 1

0

簡単なアプローチの1つは、追加することです

<xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace"
                 processContents="skip" />

関連する要素に。xml:これにより、すべての属性が許可されます。実際に ID 属性を検証したい場合は、xml名前空間用に別のスキーマを定義する必要があります

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3.org/1998/XML/Namespace">
    <xs:attribute name="id" type="xs:ID"/>
</xs:schema>

<xs:import>このスキーマをメインスキーマに追加してから宣言します

<xs:attribute ref="xml:id" use="required" />

適切な場所で。

于 2013-01-07T15:17:25.877 に答える