2012-05-08 11 views
0

xslを作成して2つのxmlを1つにマージし、別のxslに出力してhtmlビューを作成します。xmlSpyを使ってテストします。私はそれらをJava Webアプリケーションの下に置くと、何かが間違っています。 xslを適用して2つのxmlファイルをjspにマージ

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:variable name="xsdresult" select="document('xsdResult.xml')" /> 
    <xsl:variable name="schresult" select="document('result.xml')" /> 
    <xsl:template match="/"> 
    <xsl:result-document href="fullresult.xml" method="xml"> 
     <fullresult> 
      <xsl:copy-of select="$schresult/node()" /> 
      <xsl:copy-of select="$xsdresult/node()" />  
     </fullresult> 
    </xsl:result-document> 
    </xsl:template> 
</xsl:stylesheet> 

を次のようにXSLがあり、このファイルとxmlファイルが同じdirectory.and出力ファイルの下にあるすべてのですが同じです。 このXSLTを適用するには、JSP

 <?xml version="1.0" encoding="UTF-8" ?> 
    <%@ page language="java" contentType="text/html; charset=UTF-8" 
     pageEncoding="UTF-8"%> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <%@taglib uri="http://jakarta.apache.org/taglibs/xsl-1.0" prefix="xsl"%> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 

    <%@ page%> 

    <title>test</title> 
    </head> 

    <body> 
    <p> 
    <xsl:apply xml="WEB-INF/classes/result/result.xml" xsl="WEB-INF/classes/result/merge.xsl" /> 
<xsl:apply xml="WEB-INF/classes/result/xsdResult.xml" xsl="WEB-INF/classes/result/merge.xsl" /> 
<xsl:apply xml="WEB-INF/classes/result/fullresult.xml" xsl="WEB-INF/classes/result/anotherone.xsl" /> 
    </p> 
    </body> 
    </html> 

問題がmerge.xsl、文書( 'xsdResult.xml')および文書( 'result.xml')であり、彼らは常に、ECLIPSE_HOMEディレクトリの下にない検索していますtomcat webアプリケーションのディレクトリです。

+0

質問がありますか?それは何ですか? –

+0

問題は、merge.xsl、document( 'xsdResult.xml')およびdocument( 'result.xml')にありますが、常にeclipse_homeディレクトリの下で検索されていますが、tomcat webapps direcotryでは検索されません。 –

+0

はい、これは文であり質問ではありません。また、ファイルが存在すると予想される場所に貼り付けるだけで問題ありません。 –

答えて

0

URI Resolverが必要です。 what happens inside the ApplyTagを見ると、私はあなたが自分自身を提供する方法を見ません。

同様のことをするために別のApache taglibがあるようです - xtagsStyleTagApplyTagと比較して優れた仕事をしているようですが、で、URIリゾルバー(line 154参照)を使用しています。しかし、私はそれからサブクラス化せずにあなた自身のものを渡すためのきれいな方法を見ません。コードをさらにURLHelperにトレースし、document()関数内のURIを/WEB-INF/...のように変更するとより良い結果が得られるかどうかを確認することができます。

しかし、ファイルシステムからの最初のパスの結果を取得すると予想される変換の第2ステップでは、別の問題が発生する可能性が非常に高いと言えます。どこに最初のパスをダンプするfullresult.xml?アプリケーションサーバーが実行するプロセスには、そこにあるファイルシステムに書き込む権限がありますか?あなたはファイルシステムに書きたいと思っていますか?

JAXP APIを使用して変換をパイプするプレーンJavaの小さなユーティリティクラスをまとめる方がはるかに良いと思います。あなたは、URI分解能を含むパーサーの機能に必要なすべてのコントロールを持っていて、ファイルシステムを中間ストアとして使う必要はありません。それを実行するときに、変換を1回のパスで実行することも検討できます。ドキュメントをxsl:variableにマージしてテンプレートを適用するか、document()の各機能の結果にテンプレートを個別に適用するだけです。もちろん、XMLマージの結果を保持する必要がある場合を除きます。

希望します。

+0

jaxp apiを使用してxmlファイルを別のファイルに直接追加する例がありますか? –

+0

あなたのXMLファイルが小さく、あなたが並行して何千ものファイルを実行していないと仮定すると(メモリを使いすぎても心配はありません)、DOM APIを使うことができます(ここではチュートリアルはありますが、 JAXP:http://java.sun.com/webservices/reference/tutorials/jaxp/html/dom.html)。新しい文書を作成し、ルートノードを作成し、残りの2つを子ノードとして追加するか、または別のノードの内容を追加するノードを変更します。実際には、XSLTをそのまま使用し、JSPのロジックをJavaクラスに移動することを提案していました。理にかなっている? –

+0

xsltを維持することは何を意味しますか? –

関連する問題