2012-01-16 9 views
7

私は自分のXSLに国際化を追加しています。私はdictionary.xmlファイルを作成し、それをドキュメント( 'dictionary.xml')を介して私のXSLにロードする例をたくさん見てきました。同様のことをしたいのですが、dictionary.xmlファイルを作成してディスクに保存したくない場合は、サーバーの起動時にSQLから構築してDocumentオブジェクトをJavaのメモリに保持してください。私は次に、私のXSL翻訳機能がそれを使用できるように、トランスフォーマへのパラメータとして辞書文書を渡したいと思います。しかし、それは動作していないようです。ドキュメントをパラメータとしてXSLに翻訳する

関連するJavaコード:

Document dictionary = TranslationDictionary.getDictionaryDocument(); 
transformer.setParameter("dictionary", dictionary); 

辞書文書の内容:

<dictionary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <translatedString dictionaryId="BASIC_DETAILS"> 
     <language id="es" value="Detalles B&#225;sicos"/> 
    </translatedString > 
    <translatedString dictionaryId="VEHICLE_INFORMATION"> 
     <language id="es" value="Informaci&#243;n del Veh&#237;culo"/> 
    </translatedString > 
    <translatedString dictionaryId="STRUCTURE"> 
     <language id="es" value="Estructura"/> 
    </translatedString > 
    <translatedString dictionaryId="DRIVER_INFORMATION"> 
     <language id="es" value="Informaci&#243;n del Conductor"/> 
    </translatedString > 
    <translatedString dictionaryId="MAINTENANCE_AND_FEUL"> 
     <language id="es" value="Mantenimiento &amp; Combustible"/> 
    </translatedString > 
    <translatedString dictionaryId="PURCHASING"> 
     <language id="es" value="Compra"/> 
    </translatedString > 
</dictionary> 

XSLファイル:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://www.test.com"> 
    <xsl:param name="dictionary"/> 
    <xsl:param name="language" select="'es'"/> 


<xsl:template match="/"> 
<xsl:message> 
    <xsl:copy-of select="$dictionary/dictionary/translatedString[@dictionaryId='BASIC_DETAILS']/language[@id='es']/@value"/> 
</xsl:message> 

</xsl:template> 

しかし、私は何も得ます。私は$ document/documentのコピーを試してみましたが、xpathの問題がないことを確認しました。そうでないと、完全なドキュメントのコピーが得られます。これは、XSLがノードの代わりに文字列として$ dictionaryを見ているかのようです。すべての手がかりは?

+0

XSLTとしてSaxon9を使用しています。 –

+0

これは、この質問がXSLTプロセッサ固有のものであり、「xsltprocessor」タグに属しているということを助けて指摘しています。 –

答えて

4

あなたのコードのスケルトンコピーを作成しました。これは奇妙な音に起こっているが、あなたは、Javaコードであなたの辞書の文書を作成した後、あなたは、変圧器のパラメータとして設定する前に、単にメソッドを呼び出します。

dictionary.getDocumentElement(); 

それは働きます!サクソンがドキュメントであるパラメータを処理する方法のバグのように見えますが、完了していない何らかの初期化が必要ですか?私はデバッガを掘り下げていません。

+0

DOM文書を作成する別の方法を試してみましたが、XSLメッセージでルート要素が「辞書」だったとしても、文書をディスクに書き込むと「辞書」になっていました。一度私は私のxpathを変更したそれは働いた。ありがとう! –

-2

select="node-set($dictionary) 

ヘルプを

select="$dictionary 

を変更していますか?

+0

それは助けてくれません –

+0

どういうことを言っていますか?パーサーに何らかの理由で$辞書がノードセットではなくスカラー値として扱われていたバグがあった場合は、その問題の原因を特定していました。それが起こったとき、彼の行動はサクソンパーサーのバグ(私が見つけて、その後に投稿した)に起因していました。この特定のものではありません。 – user467257

+0

"問題の原因を特定しました" - ノードセット呼び出しがタイプ解釈を正しいフォーマットに強制した場合(タイプ解釈が原因であった場合)、追加しておきます。 – user467257

8

パラメータの代わりにURIResolverを使用してください。まず、このようにリゾルバを作成します。

Document dictionary = TranslationDictionary.getDictionaryDocument(); 
Map<String, Document> docs = new HashMap<String, Document>(); 
docs.put("dictionary", dictionary); 
// transformer is your javax.xml.transform.Transformer 
transformer.setURIResolver(new DocURIResolver(docs)); 

そして名前で、あなたのスタイルシートで参照:

<xsl:variable name="dict" select="document('dictionary')"/> 

これは単なるおもちゃの一例である、

public class DocURIResolver implements URIResolver { 

    final Map<String, Document> documents; 

    public DocURIResolver(final Map<String, Document> documents) { 
     this.documents = documents; 
    } 

    public Source resolve(final String href, final String base) { 
     final Document doc = documents.get(href); 
     return (doc != null) ? new DOMSource(doc) : null; 
    } 
} 

はこのようにそれを使用しますもちろん。 URIResolverは、必要に応じてフル装備にすることができます。

+0

私はカスタムURIResolverを使いたくないです。他の考え? –

+0

@DannyCohn - 何か特別な理由はありますか? –

+0

これは必要ではない複雑な追加層のようです。私がしなければならないが、私がやっていることはURIResolverを必要とするほど複雑ではないと思うので、最初に何かを試してみたい。 –

3

DOM文書ノードをSaxon変換のパラメータとして渡すと(DOMは最も効率的なツリー表現ではありませんが、動作するはずです)したがって、DOMドキュメントをラップするDOMSourceを渡す必要があります。私は通常、xsl:copy-of select = "$ doc"を実行することから始めます。これを行ったようで、値が正しく渡されていることを確認します。ドキュメント内でXPathの選択に反応して何も得られない場合、これは通常、XPath式が間違っていることを意味します。最も一般的な理由は、ルート(ドキュメント)ノードを忘れて、名前空間を忘れることです。しかし、私はあなたが私たちに示したコードにこのような間違いの証拠はないことを恐れています - あなたの投稿に表示されているXMLがDOMに反映されていると仮定します。

あなたの投稿は、プログラムでDOMドキュメントを構築したことを示唆しています。何らかの理由でSaxonが処理できないDOMを作成している可能性があります。DOMインターフェイスはあまり堅牢ではなく、人々がSaxonでテストされていないDOM実装を使用するときには時には困難があります。

また、コマンドラインからスタイルシートを実行してテストすることもできます。+ dictionary = dictを使用して$ dictionaryパラメータの値を指定できます。xml(先行する '+'は、解析する必要があるファイルの名前として認識されます)。

+0

私はオフィスに入るときにこれを試してみるつもりです。また、DOMドキュメントを適切に構築されているかどうかを確認する別の方法で構築しようとしています。あなたは、DOMが最も効率的な木表現ではないと言います。あなたは他の何かを推薦できますか?私は確かにそれを変更するために開いています。 –

関連する問題