我试图在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文档中替换占位符值的理想方法之一吗?如果我的占位符在源xml文档中,是否有任何(直接)方法使用样式表替换它们(并传递参数)?
答案 0 :(得分:2)
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作者正在使用的所有定义。