Schematronを使用したXSD検証
-
01-10-2019 - |
質問
XSDにスキーマトロン検証を追加しようとしています。これは私の新しいXSDです:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
xmlns:sch="http://www.ascc.net/xml/schematron"
elementFormDefault="qualified" >
<xs:element name="books">
<xs:complextype>
<xs:sequence> ;P
<xs:element name="book" type="bookType" maxoccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<sch:pattern id="onLoanTests" xmlns:sch="http://purl.oclc.org/dsdl/schematron">
<sch:rule context="book">
<sch:report test="@on-loan and not(@return-date)">
Every book that is on loan must have a return date
</sch:report>
</sch:rule>
</sch:pattern>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complextype>
</xs:element>
<xs:complextype name="bookType">
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author" type="xs:string" />
<xs:element name="publication-date" type="xs:string" />
</xs:sequence>
<xs:attribute name="publisher" type="xs:string" use="required" />
<xs:attribute name="on-loan" type="xs:string" use="required" />
<xs:attribute name="return-date" type="xs:string" use="optional" />
</xs:complextype>
</xs:schema>
これは私のテストXMLです:
<books>
<book publisher="ddd" on-loan="sdsd">
<title>idan title</title>
<author>idan author</author>
<publication-date>idan date</publication-date>
</book>
</books>
提供されたXMLを使用して、検証エラーが発生しません。
「ローン中のすべての本には返品日が必要です」とXMLが有効ではないというメッセージが表示されると思いました。理由についての提案?
アップデート酸素XMLエディターのスキーマトロン検証を使用して、それを機能させることができました。しかし、コードでどのように使用すると思いますか?特別なものをインストールする必要がありますか?別のライブラリへのリンク?
update2どうやら ここ 「処理」セクションでは、必要なすべての手順が詳細になります。
解決
2番目のアップデートは、おそらく主題への最良の参照です。 XSD自体は、スキーマ自体だけでなく、スキーマトロンに対して検証するメカニズムを許可していません。 xsd:appinfo
要素では、別のスキーマ言語の検証情報を埋め込むことができますが、特にアプリケーションの使用専用です(したがって名前)。
それはあなたがそれを有効にするために何かをする必要があることを意味します。あなたが参照した論文は、次のように要約する最良のアプローチを提供します。
- XSLTを使用して、XSDからSchematronルールを抽出します
- からの参照XSLT実装を使用しますschematron.com スキーマをXSLTに変換します
- XSDに対してインスタンスドキュメントを検証します
- 2で作成されたXSLTを処理することにより、スキーマトロンに対してインスタンスドキュメントを検証します。
あなたの環境に応じて、あなたは xproc 実装 (Calabash また Calumet)そのパイプラインを達成する。
所属していません StackOverflow