我正在使用以下内容将XML文档元素(,其中还包含其他文本,不仅仅是超链接)中的文本转换为超链接:
<xsl:value-of
select="replace(AUTHOR_CONTACT_INFORMATION,
'(abc@yahoo.com)',
'<a href="$1">$1</a>')"/>
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
答案 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.