我试图将java函数转换为xsl:function规范。 该函数基本上将html标记放在子字符串周围。 我现在遇到了困难:使用java内联代码这很有效,但我无法弄清楚在使用xsl:function时如何防止输出转义。 如何实现输出以包含所需的html标签?
我想要实现的一个简化示例如下: 输入参数值“AB”应该导致字符串A< b> B< / b>,当然在html浏览器中显示为A B 。
我试过的示例功能如下;但结果字符串是A& lt; b& gt; B& lt; / b& gt; (请注意,我必须添加空格以防止实体在此编辑器中被解释),这当然在浏览器中显示为A< b> B< / b&gt ;.
注意xsl:element不能在xsl:function代码中使用,因为它没有效果;我希望函数调用的字符串结果包含<和>字符,然后将字符串结果添加到输出结果文件。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:custom="http://localhost:8080/customFunctions">
<xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>
<xsl:function name="custom:test">
<xsl:param name="str"/>
<xsl:value-of select="substring($str,1,1)"/>
<xsl:text disable-output-escaping="yes"><![CDATA[<b>]]></xsl:text>
<xsl:value-of select="substring($str,2)"/>
<xsl:text disable-output-escaping="yes"><![CDATA[</b>]]></xsl:text>
</xsl:function>
<xsl:template match="/">
<xsl:element name="html">
<xsl:element name="body">
<xsl:value-of select="custom:test('AB')"/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:6)
这是一个例子,使用sequence而不是value-of并确保你的函数返回节点(通常只需通过编写文字结果元素来完成):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:custom="http://localhost:8080/customFunctions"
exclude-result-prefixes="custom">
<xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>
<xsl:function name="custom:test">
<xsl:param name="str"/>
<xsl:value-of select="substring($str,1,1)"/>
<b>
<xsl:value-of select="substring($str,2)"/>
</b>
</xsl:function>
<xsl:template match="/">
<xsl:element name="html">
<xsl:element name="body">
<xsl:sequence select="custom:test('AB')"/>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>