2012-01-24 9 views
0

XSLT要素の出力を2000文字に制限します。要素には多くのIF条件があり、どの条件が真であるかに応じてサブ要素が表示されます。変数がすべてのIFブロックで再初期化されるので、私はconcat()関数を使用できません。多くのサブ要素があるのでsubstring()を使うことはできません。すべてのサブ要素の連結を2000文字にしたいと思います。私は現在、javascriptオプションで作業していますが、多くの運がありません。私はXSLTの初心者ですので、どんな助けも大歓迎です。XSLT要素の出力を2000文字に制限します。

おかげで、 クレイトン

+0

あなたの正確な要件についてはあまりよく分からないようです。特に、「すべてのサブ要素を連結して2000文字にしたい」ということは、完全なサブツリーを削除するか、テキストノードの削除/切り捨てのみを行いますか? XML文書は単なる文字列ではなく、ノードのツリーです。あなたは、そのような木の文字列表現についてここで話しています。 XML文書の文字列表現から文字を削除すると、整形式XML文書の表現ではない文字列で終わるのは非常に簡単です。 –

+0

あいまいなステートメントには申し訳ありません。要件は、すべてのサブ要素(テキストノードのみ)を連結し、最初の2000文字を抽出することです。また、2000文字を超えるサブ要素を拒否することも意味します。 –

+0

@C D、まだ非常に曖昧です。質問を編集し、具体的な例を40文字などの制限付きで指定してください。元の出力と正確な出力を確認する必要があります。 –

答えて

0

それはあなたが素敵な方法で純粋なXSLTでこれを行うことができるとしているとは考えにくいです。代わりに、XSLT変換の後に実行される別のプログラムを作成し、結果のXMLの長い要素を2000文字に切り捨てることをお勧めします。

+0

すばらしい返信をGregにありがとう。論理を同じxslファイルに組み込んだり、新しいファイルを作成したりすると思いますか?出力が2000文字を超えることができる他の要素もあります。 –

+1

正確な要件に応じて、最初のものの後に実行される* 2番目の* XSLT変換でこれを行うのが最も簡単です。この2番目の変換では、すべてのテキストノードを最大2000文字に切り詰めることができます。 –

1

このアプローチは機能しませんか?変換が必要なときに変換を行いますが、結果は出力ドキュメントではなく変数に置きます。その後、切り捨てずに最初の変換を行う第2の変換で切り捨てを行います。その後、グレッグとKevanどちらがあなたにここで右のデザインの例を与えている

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

<xsl:variable name="normalResult"> 
    <!-- Put your basic transform code here --> 
</xsl:variable> 

<xsl:template match="/"> 
    <TrimmedResult> 
     <xsl:value-of select="substring($normalResult, 1, 2000)"/> 
    </TrimmedResult> 
</xsl:template> 

</xsl:stylesheet> 
+0

役立つはずです –

+0

ありがとうございます、これは完璧なKevan作品...ありがとう、私は次を使用しました <?xml version = "1.0" encoding = "UTF-8"?> ます。 <! - あなたの基本的な変換コードはここに入れて - > ます。

0

出力にこの部分文字列を置きます。このオーバー

のみ疑問符がパフォーマンスです。最初の変換で50Mbの出力が生成され、最初の50Kのみが必要な場合、これは効率的な方法ではありません。可能であれば、出力のサイズではなく、入力のサイズで表現するための要件を書き直してください。あなたがそれを行うことができない場合、2フェーズのアプローチがあまりにも無駄である場合、私が考えることができる唯一の解決策は、出力の量を監視するステートフルな拡張関数を注入し、これを超えています。詳細は、プロセッサの選択によって異なります。

関連する問題