1

xslで2つのxmlを1つにマージし、その出力を別のxslへの出力を使用してhtmlビューにしました。

xmlSpyを使用してテストすると、非常にうまく機能しますが、Java Webアプリケーションの下に置くと、問題が発生します。

xslは次のとおりです。

<?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>

そして、このファイルとxmlファイルはすべて同じディレクトリにあり、出力ファイルは同じです。

この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、document('xsdResult.xml')、document('result.xml')にあり、tomcat webappsディレクトリではなく、常にeclipse_homeディレクトリで検索しています。

4

1 に答える 1

0

必要なのはURI リゾルバーです。ApplyTag 内で何が起こっているかを見ると、独自のものを提供する方法がわかりません。

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

とはいえ、ファイル システムから最初のパスの結果を取得することを期待する変換の 2 番目のステップで、別の問題に遭遇する可能性が非常に高くなります。最初のパスはどこにダンプしfullresult.xmlますか? アプリケーションサーバーが代わりに実行するプロセスには、そこにあるファイルシステムへの書き込み権限がありますか? ファイルシステムに書き込みたいですか?

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

それが役に立てば幸い

于 2012-05-08T13:47:27.240 に答える