2011-02-23 39 views
2


我将文本转换(其中还包含其他文本不仅是一个超链接),以超链接使用下列内容:
逃逸内XSLT的HTML标签:值的XML文档元素中选择

<xsl:value-of 
    select="replace(AUTHOR_CONTACT_INFORMATION, 
        '([email protected])', 
        '&lt;a href=&quot;$1&quot;&gt;$1&lt;/a&gt;')"/> 

XML来源:

<AUTHOR_CONTACT_INFORMATION>Plugin author can be reached at [email protected] for his email.</AUTHOR_CONTACT_INFORMATION> 

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

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

<xsl:analyze-string select="AUTHOR_CONTACT_INFORMATION" regex="([email protected])"> 
    <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中,输出有空字符串(为了更准确,我的<td>标签在这个表达式也神秘地消失在输出之前,很奇怪)。 Qt4文档说它的处理器支持'xsl:analyze-string'。任何人在Qt中都有一个'xsl:analyze-string'的工作示例?

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

没有'xsl:analyze-string'的工作我回到原来的'replace()'。 '(这里的正则表达式)'

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

,'<一个 :

-Sanjeev

+0

我不好2.0,但也可以是[XSL:字符映射(http://www.w3.org/TR/xslt20/#dt-character-map )可能会有所帮助。 – Flack 2011-02-23 07:39:10

+0

您不能通过像这样生成'<'来创建标签。你需要输出一个实际的标签(即'(regex match)'。 – Flynn1179 2011-02-23 09:54:40

+0

)你的输入是什么,你想要创建什么输出?可能是'xsl:analyze-string' http://www.w3.org/TR/xslt20 /#analyze-string可以提供帮助,如果你的目标是用正则表达式解析纯文本,在输出中建立一个链接元素。 – 2011-02-23 11:15:04

回答

2

大家好,我将文字 XML文档元素中使用的超链接 以下href = " $ 1 " > $ 1 </a >')“

不幸的是,我无法逃脱的HREF

简短的回答使用的“<” &“>”标签:你不应该去尝试这样做。

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

的正确的方法来做到这是生成标记为(序列)文字结果元素:

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

UPDATE:该OP提供关于真实问题的详细信息。问题是,以下是他的XSLT处理器“不工作” - Qt4?

<xsl:analyze-string select="AUTHOR_CONTACT_INFORMATION" regex="([email protected])"> 
    <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> 

我已经验证该代码的行为与预期并产生预期的结果时,撒克逊05年9月1日下运行。

这意味着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(., '[email protected]')"/> 
    <a href="[email protected]">[email protected]</a> 
    <xsl:value-of select= 
    "substring-after(., '[email protected]')"/> 
</xsl:template> 
</xsl:stylesheet> 

当这个变换所提供的XML文档应用:

<AUTHOR_CONTACT_INFORMATION>Plugin author can be reached at [email protected] for his email.</AUTHOR_CONTACT_INFORMATION> 

有用,正确的结果产生(与所有8个不同的XSLT处理器我手边):

Plugin author can be reached at <a href="[email protected]">[email protected]</a> for his email. 
+0

我不知道这将如何帮助Dimitre。我在哪里放置RegEx?可能我的问题并不清楚。我在原始帖子中添加了更多信息。你能重新阅读吗? – Sanjeev 2011-02-24 03:15:31

+0

@Sanjeev:我已经更新了我的答案,并提供了一种替代解决方案,可用于有问题的XSLT处理器。 – 2011-02-24 03:53:24

+0

@Dimitre:显然,'[email protected]'不是我想要转换为超链接的唯一东西。这只是一个例子。我想转换为'href'的范围从超链接到电子邮件地址,因此解决方案应该能够使用正则表达式来查找并替换为'href'标签。同样,可能有多个超链接和电子邮件地址。例如:作者的电子邮件地址是[email protected],他的网页链接是[http://something.com/](http://something。com /) Sanjeev 2011-02-24 09:11:30