【问题标题】:Passing parameter to stylesheet with saxon使用撒克逊将参数传递给样式表
【发布时间】:2011-06-21 08:47:54
【问题描述】:
  • 我正在使用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">

【问题讨论】:

    标签: parameters xslt saxon


    【解决方案1】:

    在样式表中使用参数:

    <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:文件或目录文件:/Users/admin/Documents/$MYVAR 不存在
    • 它对我有用。确保您确实正确设置了参数。 $MYVAR 的值应该是 'file:/Users/admin/Documents` 并且不应包含 "$MYVAR"。
    • 很抱歉,我仔细检查了一下,xsl:param 没有看到transformer.setParameter 我不知道为什么。
    【解决方案2】:

    简单地使用

    <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
    • 这不起作用。我在 xslGetDataToXmlJUnit.xsl 的第 9 行遇到错误:FODC0004:文件或目录文件:/Users/admin/Documents/$MYVAR 不存在
    • 该错误消息听起来好像您没有按照建议使用concat($MYVAR, '?select=*.xml;recurse=yes'),而是类似于'$MYVAR?select=*.xml;recurse=yes'。如果您仍然有问题,请发布足够的代码,以便我们轻松重现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2010-10-02
    • 1970-01-01
    • 2015-06-09
    • 2010-12-04
    相关资源
    最近更新 更多