【问题标题】:How to use Parameters in xsl:apply-templates which are set from java?如何使用从 java 设置的 xsl:apply-templates 中的参数?
【发布时间】:2016-08-28 02:53:30
【问题描述】:

我有一个关于如何在 apply-templates select=中动态设置 xpath 表达式的问题?

<xsl:template match="CDS">
        <xsl:result-document href="{$fileName}">
            <xsl:copy>
                <xsl:apply-templates select="$xpathCondition"/>
            </xsl:copy>

        </xsl:result-document>
    </xsl:template>

这个 $xpathCondition 正在尝试从属性文件中的 java 设置并设置为 xsl 中的参数。

        transformer.setParameter("fileName", "Test.xml");
        transformer.setParameter("xpathCondition", "CD[contains(Title/text(),'TEST')]");

$fileName 正在按预期工作。但是 $xpathCondition 没有按预期工作。

【问题讨论】:

标签: java xml xslt xpath transform


【解决方案1】:

没有将字符串解析为动态 XPath 表达式并执行它的标准方法,直到您到达 XSLT 3.0 中的 xsl:evaluate 指令。您确实需要告诉我们您使用的是哪个版本 - 您使用 xsl:result-document 的事实告诉我们它是 2.0 或更高版本,但超出我们的猜测。

许多 XSLT 处理器都有一个名为 xx:eval() 或类似的扩展函数。

【讨论】:

  • 我正在使用样式表版本 - 2.0。
  • @JohnCarter 具体是哪个 XSLT 处理器?
【解决方案2】:

这个问题可以在 XSLT 3.0 中使用静态参数和影子属性来解决。你可以写:

<xsl:param name="xpathCondition" static="yes"/>

然后:

<xsl:apply-templates _select="{$xpathCondition}"/>

(注意_select中的下划线)

在 2.0(或者实际上是 1.0)中,您可以通过在执行样式表之前对其进行转换来模拟这种方法。

【讨论】:

  • 我正在尝试使用此解决方案。我将 XSLT 版本更改为 3.0,仍然面临以下异常:Error at xsl:apply-templates on line 16 of Transform.xslt: XPST0003 XPath syntax error at char 0 on line 16 in {}: Unexpected token "&lt;eof&gt;" in path expression
  • 在java中将参数设置为transformer.setParameter("xpathCondition", "CD[contains(Title/text(),'TEST')]");
  • 静态参数需要在编译时提供,而不是在运行时提供。因此,您需要使用 s9api 接口而不是 JAXP,调用 XsltCompiler.setParameter()。
猜你喜欢
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多