【问题标题】:XSLT CallTemplate ForEach XML extension functionXSLT CallTemplate ForEach XML 扩展函数
【发布时间】:2012-10-28 08:27:40
【问题描述】:

我希望 $content 是预期的字符串。我知道 $content 的 copy-of 而不是 value-of 会产生预期的字符串。但是如何不使用 copy-of 并将其传递给 java 扩展函数呢?

我问了一个不同的相关问题here

XML

<?xml version="1.0"?>
<a>
  <b c="d"/>
  <b c="d"/>
  <b c="d"/>
</a>

XSL

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template name="foo">
        <xsl:param name="content"></xsl:param>
        <!-- <xsl:copy-of select="$content"></xsl:copy-of> -->
        <!-- copy-of produces the expected string here, but how to pass to Java -->
        <xsl:value-of select="java:someMethod($content)" />
        <!-- I want the content to be the expected string -->
    </xsl:template>

    <xsl:template match="/">
        <xsl:call-template name="foo">
            <xsl:with-param name="content">
                <xsl:for-each select="a/b">
                    <e>
                        <xsl:value-of select="@c" />
                    </e>
                </xsl:for-each>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>

想要从 $content 传递给 Java 扩展函数的字符串。

<?xml version="1.0"?>
<e>d</e>
<e>d</e>
<e>d</e>

PS:调用 foo 是强制性的。

最终,我的目标是使用扩展功能在 XSLT 1.0 中模拟结果文档。

【问题讨论】:

  • 那么您的方法someMethod 期望什么样的参数?您究竟使用哪种 XSLT(2.0?)处理器?在 XSLT 1.0 中,您将结果树片段传递给扩展函数,在 XSLT 2.0 中,您将临时树片段传递给扩展函数。它如何转换为 Java 类取决于所使用的 XSLT 处理器。然而,它不是字符串,而是代表结果树片段的类的实例,分别是在使用的 XSLT 处理器的实现中的树片段。
  • someMethod 需要一个字符串。我正在使用 XSLT 1.0(对样式表属性感到抱歉。)我正在使用 Java 的 TransformerFactory。我想做的是在 XSLT 1.0 中使用扩展功能做一些类似于结果文档的事情。

标签: java templates xslt


【解决方案1】:

调用 Java 扩展函数取决于您使用的 XSLT 处理器,但您没有告诉我们。如果您使用 Java 的 TransformerFactory,您将获得类路径中的任何内容,例如 Xalan 的内置版本、Xalan 的 Apache 版本或 Saxon。

您的描述表明您希望将包含词法 XML 的字符串传递给您的 Java 扩展函数。这意味着您需要将节点序列化为字符串。如果没有诸如 saxon:serialize() 之类的扩展函数,这是无法实现的。将节点传递给 Java 方法并让 Java 方法进行序列化可能更容易。

【讨论】:

  • 内置 Apache Xalan 是我的处理器。嗯...,基本上在我的情况下,用于处理节点的 xslt 是由其他人编写的,扩展模板被编写为库并导入,所以我将向该开发人员公开一个序列化函数。谢谢,我会在标记为答案之前稍等片刻。谢谢!
  • 实际上来自 Apache 的 Xalan 与内置于 JDK 中的 Xalan 版本不是同一个处理器。差别不大,只是Apache版本的bug少了点。
猜你喜欢
  • 1970-01-01
  • 2012-04-30
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多