2017-09-16 8 views
0

いくつかのXMLスキーマドキュメントをテキストファイルのセットに変換するために、XSLT 2.0(SaxonHE)を使用しています。 レッツは、私はそれぞれのxsのための別の出力ファイルを欲しいと言う:complexTypeの入力XSDで見つかった、私のテンプレートには、次の入力XMLが何も一致しない場合、XSLTプロセッサは空のファイルを生成するのはなぜですか?

の少なくとも1種の元素を含む任意のXSDについては

<?xml version="1.0" encoding="UTF-8"?> 
 
<xsl:stylesheet version="2.0" 
 
\t xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
 
\t <xsl:output method="text" /> 
 
\t 
 

 
\t <xsl:template match="@*|node()"> 
 
\t \t <xsl:apply-templates select="node()|@*" /> 
 
\t </xsl:template> 
 

 
\t <xsl:template match="xs:complexType[@name]"> 
 
\t \t <xsl:variable name="fileName" select="concat('target/',@name,'.txt')" /> 
 
\t \t <xsl:result-document href="{$fileName}"><xsl:value-of select="$fileName"/></xsl:result-document> 
 
\t </xsl:template> 
 
</xsl:stylesheet>

ようloolますxs:complexType、私が得た出力は 'target/{$ fileName} .txt'で正しく生成され、他のファイルはプロセスで生成されません。

私はxs:complexTypeが含まれていないXSDでこの変換を実行すると、名前が$ {input_file} .xmlに続くデフォルトの空のxmlファイルが生成されます。$ {input_file}は入力ファイルの名前。 (たとえば、books.xsdはbooks.xsd.xmlに変換されます)。 私の変換で選択されたテンプレートと何も一致しないときに、そのデフォルトXMLファイルを取り除くには?

私が使用するプロセッサはSaxonHE9ですが、他のプロセッサと同じ結果が得られます。

+0

oXygenのようなエディタを使って、コマンドライン(どのようにコマンドラインが正確に見えるか)、Javaまたは.NET(Javaまたは.NETコードはどのように見えますか)からSaxonをどのくらい正確に実行しますか? –

+1

一般に、https://www.w3。org/TR/xslt20 /#execution-a-transformation mandates "変換の過程でxsl:result-document命令が評価されていなければ、結果シーケンスが空のときに暗黙の結果ツリーも作成されます。暗黙の結果ツリーは子ノードのないドキュメントノードで構成されます。これは、あなたが今までに提供した詳細は、あなたがあなたが得ると言う特定のファイル名を得る理由を説明していませんが、あなたが1つを望まないときの最終結果の理由になる可能性があります。 –

+0

saxonプロセッサ(Java実装)は、次のようにコマンドラインで呼び出されます。 java -classpath saxon9he.jar net.sf.saxon.Transform -t -xsl:transform.xsl -s:./ schemas -o: ./target ./schemasと./targetの両方がディレクトリです。プロセッサをいくつかの入力ファイルで同時に実行したいからです。 –

答えて

0

実際にはXSLT 2.0仕様では少なくとも1つの結果ドキュメントが必要であるため、2次結果ドキュメントが作成されていない場合、空の場合でもプライマリ結果が作成されます。恐ろしく複雑なルールですが、WGメンバーの中には、XSLT 1.0との互換性が必要だと感じていると思います。

第1次結果には、「ベース出力URI」によって決定されるファイル名があります。コマンドラインからディレクトリ全体を処理すると、各変換の基本出力URIは、出力ディレクトリの名前と入力ファイルの名前の最後の部分から形成されます。

XSLT 3.0仕様は、このルールを緩和します。これは、(非規範的に)言う:この仕様の以前のバージョンでは

それが最初のテンプレートや機能の 生の結果が空のシーケンスであるとき、 結果ツリーが場合にのみ生成されるべきであると述べました。変換 が二次結果を生成しない場合(つまり、 xsl:result-documentを呼び出さない場合)この変換では、 のシリアル化された結果が生成され、これらの結果が永続ストレージに書き込まれると、 の効果が得られる可能性が最も高くなります。その結果は となり、空のプリンシパル結果を生成する変換は ベース出力URIの場所が の場合は、変換によって他の出力が生成されない場合のみです。以前のバージョンのXSLTとの下位互換性を提供するプロセッサAPI は、この動作を遵守する必要がありますが、新しいプロセッサ APIの要件はありません。

サクソンは当面2.0行動を維持するという慎重なアプローチをとっていますが、確かにもう一度見直す価値があります。

関連する問題