【问题标题】:XSLT transformation passing parametersXSLT 转换传递参数
【发布时间】:2012-10-08 11:00:34
【问题描述】:

我试图在 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));

第一季度。我只是想知道在创建 Transformer 时使用 DOMSource 有什么问题

第二季度。这是在 xml 文档中用值替换占位符的理想方法之一吗?如果我的占位符位于源 xml 文档中,是否有任何(直接)方法可以使用样式表(并传递参数)替换它们?

【问题讨论】:

  • 其他使用 DOMSource here的问题
  • 我会说这是一个错误,您应该将它报告给 Oracle。 JRE 使用重新打包的 Apache Xalan 版本。很长一段时间(自 2007 年以来)那里没有发生任何事情。

标签: xslt jaxp


【解决方案1】:

Q1:这是一个命名空间感知问题。您需要让 DocumentBuilderFactory 命名空间感知:

factory.setNamespaceAware(true);

Q2:有几种方法可以从外部 xml 文件中获取值。一种方法是使用文档函数和文档中的顶级变量:

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

您可以从模板中删除第二个参数,然后使用以下行查找值:

<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 作者正在使用的所有定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多