我希望$ content是预期的字符串。我知道copy-of而不是value-of $ content会产生预期的字符串。但是我如何不使用copy-of并将其传递给java扩展函数?
我问了一个不同的相关问题here。
<?xml version="1.0"?>
<a>
<b c="d"/>
<b c="d"/>
<b c="d"/>
</a>
<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>
Desired String从$ content传递给Java扩展函数。
<?xml version="1.0"?>
<e>d</e>
<e>d</e>
<e>d</e>
PS:调用foo是强制性的。
最终,我的目标是使用扩展函数在XSLT 1.0中模拟结果文档。
答案 0 :(得分:1)
调用Java扩展函数取决于您使用的是哪个XSLT处理器,您尚未告诉我们。如果您使用Java的TransformerFactory,您将获得类路径上的任何内容,例如Xalan的内置版本,Xalan的Apache版本或Saxon。
您的描述建议您将包含词汇XML的字符串传递给Java扩展函数。这意味着您需要将节点序列化为字符串。没有像saxon:serialize()这样的扩展函数就无法实现。将节点传递给Java方法可能更容易,并且让Java方法进行序列化。