我希望$ content是预期的字符串。我知道$ content的copy-of而不是value-会产生预期的字符串。但是,如何不使用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中模拟结果文档。

最佳答案

调用Java扩展功能取决于您所使用的XSLT处理器,而您尚未告诉我们。如果使用Java的TransformerFactory,则将获得类路径上的任何内容,例如Xalan的内置版本,Xalan的Apache版本或Saxon。

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

09-25 17:48
查看更多