4

私は XML インクルードを使用して、人間とマシンの両方が使用できる必要がある大規模な XML 構造を管理しようとしています。

しかし、既存のスキーマに対して検証できる XML ファイルを作成しようとすると、無数の問題が発生します。これは、私がやろうとしていることの簡単な例です。

「main.xml」ファイルが検証されません。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xml - This fails to validate. -->
<ns1:main xsi:schemaLocation="http://www.example.com/main main.xsd"
          xmlns:ns1="http://www.example.com/main"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xi="http://www.w3.org/2001/XInclude">

    <name>String</name>
    <xi:include href="child.xml"/> <!-- What I'm trying to do. -->

</ns1:main>

「child.xml」ファイルは、スタンドアロン ファイルとして正常に検証されます。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Child.xml - This validates fine, as a standalone file. -->
<ns1:child xsi:schemaLocation="http://www.example.com/main main.xsd"
           xmlns:ns1="http://www.example.com/main"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <name>String</name>
    <age>String</age>

 </ns1:child>

ここに私のスキーマがあります:

 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Main.xsd - My Simplified Schema -->
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:ns1="http://www.example.com/main"
            targetNamespace="http://www.example.com/main">

    <!-- Main Element (References Child) -->
    <xs:element name="main">
         <xs:complexType>
             <xs:sequence>
                 <xs:element name="name" type="xs:string"/>
                 <xs:element ref="ns1:child"/>
             </xs:sequence>
         </xs:complexType>
    </xs:element>

    <!-- Child Element -->
    <xs:element name="child">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="age" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
     </xs:element>

</xs:schema>

私の問題はほぼ明らかに名前空間に関連していますが、問題を解決する方法がわかりません。

4

4 に答える 4

4

grantwparks に同意します。XInclude と XML スキーマは絶対に一緒に使用できます。仕様は意図的に互いに独立しています。どうやら XInclude の作成者は、インクルードを検証前または検証後に処理できるようにする自由を提供したかったようです。

この問題については、 velocityreviews のスレッドで説明されています。この問題を理解するのに役立つ答えは、xml.comのこの投稿から引用したものです。

XInclude に関する最も一般的な質問の 1 つは、包含が検証、XSL 変換、および XML ドキュメントに適用される可能性のあるその他のプロセスとどのように相互作用するかということです。短い答えは、そうではないということです。XInclusion は、他の XML プロセスの一部ではありません。これは、いつどこで役立つかを実行する場合と実行しない場合がある別の手順です。

たとえば、スキーマに対する検証を考えてみましょう。ドキュメントは、含める前、含めた後、またはその両方で検証できます。xi:include 要素が置換される前にドキュメントを検証する場合、スキーマは他の要素を宣言するのと同じように xi:include 要素を宣言する必要があります。xi:include 要素が置換された後にドキュメントを検証する場合、スキーマは置換要素を宣言する必要があります。包含と検証は、ローカル環境で便利な任意の順序で実行できる別個の直交プロセスです。

要するに、検証前に XML ツールで xi:include 要素を処理するようにすることです (これが OP の例に必要なものです)。たとえば、Eclipse の XML エディターでは、XML -> XML ファイル -> 検証 (RSA 8.5 を使用) の下に "Process XML Inclusions" という設定があります。検証。

アンディ

于 2012-10-20T14:02:36.863 に答える
2

これは、XInclude とスキーマの非互換性が原因ではないと思います。検証前にインクルードが処理されていないように見えます。したがって、スキーマでは、メインの「インクルード」要素は許可されず、「子」要素のみが許可されます。検証前に XML プロセッサにインクルードの処理を強制できれば...

于 2011-10-05T20:44:20.973 に答える
1

XML Schema と XInclude の仕様が相互に互換性があるとは限りません。個々の XML プロセッサは許可するかもしれませんが、許可しないものもあります。

原則として、この 2 つを一緒に使用するべきではないと思います。

PS なぜこれが名前空間の問題だと思うのかわかりません。その印象を与えるものは何ですか?

于 2009-07-08T13:42:22.730 に答える