schematron を使用してインスタンス ドキュメントを検証しようとしていますが、Java XSLT プロセッサの実装に問題があります。スキーマトロンから XSL を生成しようとすると、単純なものであっても、予想とは異なる結果が得られます。
xsltproc (cygwin) を使用して変換を行う場合、すべて問題ありません。しかし、Saxon-B 9.1.0.8、デフォルトの Java 1.6 実装、または Saxon-PE 9.3.0.5 での Oxygen IDE の XSLT デバッガーを使用すると、無効な XSL ファイルが生成されます。原因は、名前空間がどこにも宣言されていないプレフィックスを含む要素のextension-element-prefixes
属性です。このようなスタイルシートは、使用すると必ず失敗します。xsl:stylesheet
exsl
スキーマトロンは実行時にアプリケーションで生成されるため、生成されたファイルを手動で編集することは問題外です。私は何か間違ったことをしなければなりませんよね?問題を に追跡しましたiso_schematron_skeleton_for_saxon.xsl
(またはiso_schematron_skeleton_for_xslt1.xsl
、使用されている実装によっては、はい、両方を試してみましたが、最終結果は同じでした)。スケルトンは名前空間が欠落している適切なスタイルシートを明確に作成しますが、後でどういうわけか魔法のように削除されます。私は XSLT の専門家ではないので、ここで何が間違っているのかわかりません。私がどこかで見逃したばかげたものだと確信しています。以下の入力の出力が異なる理由を知りたいです。
これは、いくつかの名前空間を定義するだけのサンプル スキーマトロンです (これが有効なスキーマと見なされることを願っています)。
<?xml version="1.0" encoding="utf-8"?>
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"
queryBinding="exslt">
<sch:ns uri="http://exslt.org/dynamic" prefix="dyn"/>
<sch:ns xmlns:rng="http://relaxng.org/ns/structure/1.0"
xmlns:nma="urn:ietf:params:xml:ns:netmod:dsdl-annotations:1"
uri="urn:ietf:params:xml:ns:yang:ietf-inet-types"
prefix="inet"/>
<sch:ns xmlns:rng="http://relaxng.org/ns/structure/1.0"
xmlns:nma="urn:ietf:params:xml:ns:netmod:dsdl-annotations:1"
uri="urn:ietf:params:xml:ns:yang:ietf-ipfix-psamp"
prefix="ipfix"/>
<sch:ns xmlns:rng="http://relaxng.org/ns/structure/1.0"
xmlns:nma="urn:ietf:params:xml:ns:netmod:dsdl-annotations:1"
uri="urn:ietf:params:xml:ns:yang:ietf-yang-types"
prefix="yang"/>
<sch:ns xmlns:rng="http://relaxng.org/ns/structure/1.0"
xmlns:nma="urn:ietf:params:xml:ns:netmod:dsdl-annotations:1"
uri="urn:ietf:params:xml:ns:netconf:base:1.0"
prefix="nc"/>
</sch:schema>
Java XSLT プロセッサから取得したスニペットを次に示します (これは Oxygen からのものです。xslt1 または xslt2 の iso が使用されているかどうかは関係ありません。問題は解決しません)。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--This XSLT was automatically generated from a Schematron schema.-->
<xsl:stylesheet xmlns:sch="http://www.ascc.net/xml/schematron"
xmlns:set="http://exslt.org/sets"
xmlns:str="http://exslt.org/strings"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
xmlns:dyn="http://exslt.org/dynamic"
xmlns:iso="http://purl.oclc.org/dsdl/schematron"
xmlns:math="http://exslt.org/math"
xmlns:random="http://exslt.org/random"
xmlns:regexp="http://exslt.org/regular-expressions"
xmlns:inet="urn:ietf:params:xml:ns:yang:ietf-inet-types"
xmlns:ipfix="urn:ietf:params:xml:ns:yang:ietf-ipfix-psamp"
xmlns:yang="urn:ietf:params:xml:ns:yang:ietf-yang-types"
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"
extension-element-prefixes="date dyn exsl math random regexp set str"
version="1.0">
<!--Removed in favor of brevity.-->
</xsl:stylesheet>
xsltproc が生成するものと、Java にも生成してほしいものは次のとおりです。
<?xml version="1.0" standalone="yes"?>
<!--This XSLT was automatically generated from a Schematron schema.-->
<axsl:stylesheet
xmlns:date="http://exslt.org/dates-and-times"
xmlns:dyn="http://exslt.org/dynamic"
xmlns:exsl="http://exslt.org/common"
xmlns:math="http://exslt.org/math"
xmlns:random="http://exslt.org/random"
xmlns:regexp="http://exslt.org/regular-expressions"
xmlns:set="http://exslt.org/sets"
xmlns:str="http://exslt.org/strings"
xmlns:axsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sch="http://www.ascc.net/xml/schematron"
xmlns:iso="http://purl.oclc.org/dsdl/schematron"
xmlns:inet="urn:ietf:params:xml:ns:yang:ietf-inet-types"
xmlns:ipfix="urn:ietf:params:xml:ns:yang:ietf-ipfix-psamp"
xmlns:yang="urn:ietf:params:xml:ns:yang:ietf-yang-types"
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"
extension-element-prefixes="date dyn exsl math random regexp set str"
version="1.0">
<!--Removed in favor of brevity.-->
</axsl:stylesheet>
ご覧のとおり、Java 出力には、対応するプレフィックスの exsl 名前空間がありません。名前空間を処理することになっている iso スケルトンの部分に実験的なフラグが立てられていることに気付きました.必要に応じて、これを機能させるために汚いハックを適用するつもりです (schematron を詳細に学習していないために恥ずかしいことを尋ねている場合を除きます)。 )。何か案は?
編集: Martin が以下のコメントで提案したように、純粋な XSLT 1.0 プロセッサを使用してみました。xalan (コンパイル済みバージョンと解釈バージョンの両方) と saxon 6.5.5 を使用しました。どちらの xalans も exsl 名前空間を追加しません。Saxon は、「属性が追加された後に名前空間を追加できません」などのエラーでスキーマトロンの処理に失敗することさえあります (xslt1 の iso スケルトンの 1534 行目)。queryBinding="exslt" でスキーマトロンを変換できる唯一のプロセッサは xsltproc のままです。また、私が試した唯一の非 Java プロセッサでもあります。問題のある XSL を少し読んだ後、変換が saxon9 でテストされているという主張が行われているコメントに気付きました。したがって、これは機能する必要があります。
PS: 長い投稿で申し訳ありませんが、この例を示すことが重要だと思います。