3

XSLT 変換中にパラメーターを渡そうとしています。これがxslスタイルシートです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:param name="param1" select="'defaultval1'" />
 <xsl:param name="param2" select="'defaultval2'" /> 
 <xsl:template match="/">
  <xslttest>
    <tagg param1="{$param1}"><xsl:value-of select="$param2" /></tagg>
  </xslttest>
</xsl:template>
</xsl:stylesheet>

以下はJavaコードです。

File xsltFile = new File("template.xsl");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document stylesheet = builder.parse("template.xsl");
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer xsltTransformer = transformerFactory.newTransformer(new DOMSource(stylesheet));
//Transformer xsltTransformer = transformerFactory.newTransformer(new StreamSource(xsltFile));
xsltTransformer.setParameter("param1", "value1");
xsltTransformer.setParameter("param2", "value2");
StreamResult result = new StreamResult(System.out);
xsltTransformer.transform(new DOMSource(builder.newDocument()), result);

次のエラーが表示されます:- エラー: 「変数またはパラメーター 'param1' は未定義です。」致命的なエラー: 「スタイルシートをコンパイルできませんでした」

ただし、次の行を使用してトランスフォーマーを作成すると、すべて正常に動作します。

Transformer xsltTransformer = transformerFactory.newTransformer(new StreamSource(xsltFile));

Q1. Transformer の作成に DOMSource を使用する際の何が問題なのか知りたかっただけです。

Q2. これは、xml ドキュメントのプレースホルダーの値を置き換える理想的な方法の 1 つですか? プレースホルダーがソース xml ドキュメントにある場合、スタイル シートを使用して (およびパラメーターを渡す) それらを置き換える (簡単な) 方法はありますか?

4

1 に答える 1

2

Q1: これは名前空間認識の問題です。DocumentBuilderFactory 名前空間を認識させる必要があります。

factory.setNamespaceAware(true);

Q2: 外部の xml ファイルから値を取得するには、いくつかの方法があります。これを行う 1 つの方法は、ドキュメント関数とドキュメント内の最上位変数を使用することです。

<!-- Loads a map relative to the template. -->
<xsl:variable name="map" select="document('map.xml')"/>

次に、マップから値を選択できます。たとえば、map.xml が次のように定義されているとします。

<?xml version="1.0" encoding="UTF-8"?>
<mappings>
  <mapping key="value1">value2</mapping>
</mappings>

テンプレートから 2 番目のパラメーターを削除し、次の行を使用して値を検索できます。

<tagg param1="{$param1}"><xsl:value-of select="$map/mappings/mapping[@key=$param1]"/></tagg>

相対ドキュメント URI を使用するには、スタイルシートにシステム ID が指定されている必要があるため、DOMSource の作成方法を更新する必要があることに注意してください。

DOMSource source = new DOMSource();
source.setNode(stylesheet);
source.setSystemId(xsltFile.toURL().toString());

一般に、Java の XML API で使用できるすべてのオプションを検討することをお勧めします。利用可能なすべての機能が、あなたがやろうとしていることに対して正しく設定されていないと仮定してください。XML Information Setも読むことをお勧めします。その仕様は、API 作成者が使用しているすべての定義を提供します。

于 2012-11-20T07:37:12.690 に答える