函数如何返回包含html标记的字符串值
我试图将java函数转换为xsl:function规范。 该函数基本上在子字符串周围放置html标记。 现在,我遇到了一些困难:使用java内联代码这非常有效,但我无法找出如何在使用xsl:函数时防止输出转义。 如何实现包含所需html标记的输出 下面是我试图实现的一个简化示例: 输入参数值“AB”应该指向字符串AB,当然在html浏览器中显示为AB 下面是我尝试过的函数示例;但是结果字符串是A<;b>;B</b>;(注意,我必须添加空格,以防止实体在这个编辑器中被解释),这当然在浏览器中显示为AB 注意xsl:element不能在xsl:function代码中使用,因为这没有效果;我希望函数调用的字符串结果包含<和>,然后将字符串结果添加到输出结果文件中函数如何返回包含html标记的字符串值,html,function,xslt,xslt-2.0,Html,Function,Xslt,Xslt 2.0,我试图将java函数转换为xsl:function规范。 该函数基本上在子字符串周围放置html标记。 现在,我遇到了一些困难:使用java内联代码这非常有效,但我无法找出如何在使用xsl:函数时防止输出转义。 如何实现包含所需html标记的输出 下面是我试图实现的一个简化示例: 输入参数值“AB”应该指向字符串AB,当然在html浏览器中显示为AB 下面是我尝试过的函数示例;但是结果字符串是A<;b>;B</b>;(注意,我必须添加空格,以防止实体在这个编辑器中被解释),这当然
<?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>
]]>
]]>
下面是一个示例,使用sequence而不是value of,并确保函数返回节点(通常只需编写文本结果元素即可):
这么简单?应该知道/试过!我还注意到了另一个简单的解决办法:我忘了在函数调用中添加禁用输出转义:这解决了问题。考虑到避免任何禁用输出的黑客攻击,您只需要在函数体中创建节点而不是字符串,并且需要确保输出函数结果作为返回。(使用xsl:sequence
)而不是其字符串值(使用xsl:value'
)。
<?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>