Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数如何返回包含html标记的字符串值_Html_Function_Xslt_Xslt 2.0 - Fatal编程技术网

函数如何返回包含html标记的字符串值

函数如何返回包含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>;(注意,我必须添加空格,以防止实体在这个编辑器中被解释),这当然

我试图将java函数转换为xsl:function规范。 该函数基本上在子字符串周围放置html标记。 现在,我遇到了一些困难:使用java内联代码这非常有效,但我无法找出如何在使用xsl:函数时防止输出转义。 如何实现包含所需html标记的输出

下面是我试图实现的一个简化示例: 输入参数值“AB”应该指向字符串AB,当然在html浏览器中显示为AB

下面是我尝试过的函数示例;但是结果字符串是A<;b>;B</b>;(注意,我必须添加空格,以防止实体在这个编辑器中被解释),这当然在浏览器中显示为AB

注意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>

]]>
]]>

下面是一个示例,使用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>