使用Saxon将参数传递给样式表

5
  • 我正在使用net.sf.saxon.TransformerFactoryImpl对多个XML文件进行转换。
  • 我正在使用集合函数获取XML文件。

我想做的事情是,不知道是否可能,将一个包含我的XML文件路径的变量传递给样式表。我想从我的Java代码中传递该变量。

    <xsl:for-each 
        select="for $x in(collection('MYVAR?select=*.xml;recurse=yes'))
                    return saxon:discard-document($x)//testsuites">
2个回答

4

只需简单使用

<xsl:for-each select="for $x in(collection(concat($MYVAR, '?select=*.xml;recurse=yes')))return saxon:discard-document($x)//testsuites">

请注意,MYVAR 应该是一个文件 URL,而不是一个(平台相关的)目录路径。
[编辑] 在您的 XSLT 中,您需要:
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:param name="MYVAR"/>

  ...

</xsl:stylesheet>

在你的Java代码中使用方法http://download.oracle.com/javase/6/docs/api/javax/xml/transform/Transformer.html#setParameter%28java.lang.String,%20java.lang.Object%29,例如:

transformer.setParameter("MYVAR", "file:///C:/dir/subdir/dir");

我觉得你没明白我的意思。我想要问的是如何使用Java代码将URL放入$MYVAR中。 - Theo
这不起作用。我得到了以下错误: xslGetDataToXmlJUnit.xsl 的第 9 行出现错误: FODC0004:文件或目录 file:/Users/admin/Documents/$MYVAR 不存在 - Theo
那个错误信息听起来好像你没有使用建议的concat($MYVAR, '?select=*.xml;recurse=yes'),而是类似于'$MYVAR?select=*.xml;recurse=yes'的东西。如果你仍然有问题,请发布足够的代码,让我们能够轻松地重现这个问题。 - Martin Honnen

0
在你的样式表中使用一个参数:
<xsl:param name="MYVAR" />

在调用转换之前,可以像这样在Java中设置参数:
transformer.setParameter("MYVAR", 'file:/some/folder');

在样式表中引用参数的方式与引用任何变量或参数的方式相同:

<xsl:for-each select="for $x in
                        (collection(concat($MYVAR, '?select=*.xml;recurse=yes')))
                          return saxon:discard-document($x)//testsuites">

这个不起作用。我在xslGetDataToXmlJUnit.xsl的第9行收到错误:FODC0004:文件或目录file:/Users/admin/Documents/$MYVAR不存在。 - Theo
它对我有效。确保你正确地设置了参数。$MYVAR的值应该是'file:/Users/admin/Documents',而不应包含“$MYVAR”。 - Mads Hansen
很抱歉,但我仔细检查了,xsl:param没有看到transformer.setParameter。我不知道为什么。 - Theo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接