在xslt:value-of select中转义html标签

时间:2011-02-23 07:31:29

标签: qt4 xslt


我正在使用以下内容将XML文档元素(,其中还包含其他文本,不仅仅是超链接)中的文本转换为超链接:

<xsl:value-of 
     select="replace(AUTHOR_CONTACT_INFORMATION, 
                     '(abc@yahoo.com)', 
                     '&lt;a href=&quot;$1&quot;&gt;$1&lt;/a&gt;')"/>

XML来源:

<AUTHOR_CONTACT_INFORMATION>Plugin author can be reached at abc@yahoo.com for his email.</AUTHOR_CONTACT_INFORMATION>

不幸的是,我无法逃脱'&lt;' &安培; '&GT;' href中使用的标签。我的XSLT处理器是Qt4的QXmlQuery类。它似乎不支持上述表达式中的“disable-output-escaping”属性,我似乎找不到任何其他方法,而是手动解析最终输出并替换每个'&amp; lt'&amp; '&amp; gt'与'&lt;' &安培; '&GT;'使用C ++代码。

PS:无法让'analyze-string'在qt中工作。它只返回空字符串。提到http://www.dpawson.co.uk/xsl/rev2/regex2.html问题3并使用以下内容:

<xsl:analyze-string select="AUTHOR_CONTACT_INFORMATION" regex="(abc@yahoo.com)">
    <xsl:matching-substring>
        <a href="{.}"><xsl:value-of select="." /></a>
    </xsl:matching-substring>

    <xsl:non-matching-substring>  
        <xsl:value-of select="." />
    </xsl:non-matching-substring>
</xsl:analyze-string>

上面的'Altova XMLSpy'正常运行正是我想要的。但是在Qt4中,输出具有空字符串(为了更准确我的&lt; td&gt;标签,此表达式在输出中也神秘地消失了,很奇怪)。 Qt4文档称它的处理器支持'xsl:analyze-string'。 Qt中有没有一个'xsl:analyze-string'的工作示例?

Qt4文档说它的处理器不支持'xsl:character-map'所以没有意义。

如果没有'xsl:analyze-string'工作,我将使用'replace()'回到原点。

-Sanjeev

1 个答案:

答案 0 :(得分:2)

  

大家好,我正在转换文本   XML文档元素到超链接   使用以下内容:

<xsl:value-of select="replace(AUTHOR_CONTACT_INFORMATION,
     

'(RegEx here)','&lt; a   HREF = “$ 1” &GT; $ 1·; / A&GT;')“

     

不幸的是,我无法逃脱'&lt;'   &安培; '&GT;' href中使用的标签

简短的回答:你甚至不应该尝试这样做。

转义标记会将其降级为一维文本,并且只会在浏览器中显示为文本。

执行此操作的正确方法是将标记生成为(一系列)文字结果元素:

<xsl:template match="AUTHOR_CONTACT_INFORMATION">
  <a href="{someExpression}"><xsl:value-of select="someExpr2"/></a>
</xsl:template>

更新:OP提供了有关实际问题的更多信息。问题是,他的XSLT处理器上的“不工作” - Qt4 ???

<xsl:analyze-string select="AUTHOR_CONTACT_INFORMATION" regex="(abc@yahoo.com)">
    <xsl:matching-substring>
        <a href="{.}">
            <xsl:value-of select="." />
        </a>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
        <xsl:value-of select="." />
    </xsl:non-matching-substring>
</xsl:analyze-string>

我已经验证此代码的行为符合预期,并在Saxon 9.1.05下运行时产生预期结果。

这意味着Qt4不是兼容的XSLT 2.0处理器。

在这里,我可以提供以下替代解决方案,它适用于XSLT 1.0处理器和XSLT 2.0处理器:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="AUTHOR_CONTACT_INFORMATION">
  <xsl:value-of select=
   "substring-before(., 'abc@yahoo.com')"/>
  <a href="abc@yahoo.com">abc@yahoo.com</a>
  <xsl:value-of select=
   "substring-after(., 'abc@yahoo.com')"/>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<AUTHOR_CONTACT_INFORMATION>Plugin author can be reached at abc@yahoo.com for his email.</AUTHOR_CONTACT_INFORMATION>

产生了想要的,正确的结果(我手头有所有8种不同的XSLT处理器):

Plugin author can be reached at <a href="abc@yahoo.com">abc@yahoo.com</a> for his email.