属性の名前空間と、そのような属性を 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 スキーマを宣言する方法を教えてください。
よろしく/ミカエル