2人の顧客について説明します。custom
最初のXSDは、参照しているが定義していないものを除いて、すべての一般的な部分をキャプチャすることになっている基本的なXSDです。「ぶら下がっている」ままにしておきます。
以下はcommon.xsdです:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="MainElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="id" type="xsd:unsignedByte" />
<xsd:element name="name" type="xsd:string" />
<xsd:element ref="custom"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
次に、ごとに1つのXSDの定義を開始しますcustom
。最初のXML(custom-1.xsd)の場合:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="custom">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="age" type="xsd:unsignedShort"/>
<xsd:element name="sex" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
そして2つ目は、custom-2.xsdです。
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="custom">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="age" type="xsd:unsignedShort"/>
<xsd:element name="country" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
次に、XSDを適切にロードして、顧客ごとに1つのスキーマセットを作成する必要があります。最初のセットには、common + custom-1、次にcommon+custom-2などが含まれます。
これは、QTAssistantを使用してこれらのセットを「視覚化」する方法です。
もちろん、それ自体Common
は無効です。
Error occurred while loading [file:///.../validate-xml-element-with-xsd-2.xsd], line 9 position 10.
The 'custom' element is not declared.
ただし、セット内の追加のXSDにより、欠落している定義がスコープに含まれるため、他の各コレクションは有効です。これで、各ベンダーのXMLを関連するセットで検証できます。共通のXSDを共有しているため、ベンダー間で共通の定義の整合性を維持し、ダングリング定義を使用してXSD1.0の「制限」を回避します。私は実際には制限ではないと思います。それはおそらく「それほどエレガントではない」アプローチです...
処理の観点からは、一般的なXSDを、ベンダーの数だけコンパイルしてロードするというオーバーヘッドが発生します。
これが負担になる場合は、XMLの前処理のリターンが報われたら、別の戦略を使用することもできます。anyTypeとして定義したままcustom
にすることも、xsd:anyに置き換えることもできます。コモンを検証したら、ノード(XSLTまたはDOM API、あるいはDOMノードリーダーの上にある検証リーダーなど)を抽出し、適切なXSDを使用して個別に検証します。
後者のアプローチの利点は、XSDに関してオーバーヘッドが発生しないことです。もちろん、トレードオフにより、処理のフットプリントが増加する可能性があります。
XSD 1.1、XSD 1.0 + Schematron、RelaxNGは、独自の長所と短所を持つ別のスキーマ言語を含むソリューションです。上記は、少なくともあなたが持っているオプションのいくつかを理解するのに役立つはずだと思います...