我正在尝试为下面的xml中的2个网址创建超链接。 我的输入xml消息是这样的:
<comment xmlns:xs="http://www.w3.org/2001/XMLSchema">
<biid>
311
</biid>
<addComment>
<p>www.test.com works another www.test.com doesn&#39;t work</p>
</addComment>
</comment>
当我将xml消息放入xsl时,如下所述:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="*/addComment">
<xsl:choose>
<xsl:when test="contains(.,'http://')=true()">
<addComment>
<xsl:value-of select="substring-before(.,'http://')" />
<xsl:value-of select="'&lt;a target=&quot;_blank&quot; href=&quot;'" disable-output-escaping="yes" />
<xsl:choose>
<xsl:when test="not(contains(substring-after(.,'http://'),' '))">
<xsl:value-of
select="concat('http://',substring-before(substring-after(.,'http://'),'<'))" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select="concat('http://',substring-before(substring-after(.,'http://'),' '))" />
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="'&quot;&gt;'" disable-output-escaping="yes"/>
<xsl:choose>
<xsl:when test="not(contains(substring-after(.,'http://'),' '))">
<xsl:value-of
select="concat('http://',substring-before(substring-after(.,'http://'),'<'))" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select="concat('http://',substring-before(substring-after(.,'http://'),' '))" />
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="'</a>'" />
<xsl:value-of
select="concat(' ',substring-after(substring-after(.,'http://'),' '))" />
</addComment>
</xsl:when>
<xsl:when test="contains(.,'www.')=true()">
<addComment>
<xsl:value-of select="substring-before(.,'www.')" />
<xsl:value-of select="'&lt;a target=&quot;_blank&quot; href=&quot;'" disable-output-escaping="yes" />
<xsl:choose>
<xsl:when test="not(contains(substring-after(.,'www.'),' '))">
<xsl:value-of
select="concat('http://www.',substring-before(substring-after(.,'www.'),'<'))" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select="concat('http://www.',substring-before(substring-after(.,'www.'),' '))" />
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="'&quot;&gt;'" disable-output-escaping="yes"/>
<xsl:choose>
<xsl:when test="not(contains(substring-after(.,'www.'),' '))">
<xsl:value-of
select="concat('http://www.',substring-before(substring-after(.,'www.'),'<'))" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select="concat('http://www.',substring-before(substring-after(.,'www.'),' '))" />
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="'</a>'" />
<xsl:value-of
select="concat(' ',substring-after(substring-after(.,'www.'),' '))" />
</addComment>
</xsl:when>
<xsl:otherwise>
<addComment>
<xsl:apply-templates />
</addComment>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但结果xml只有一个url超链接:
<?xml version="1.0" encoding="UTF-8"?><comment xmlns:xs="http://www.w3.org/2001/XMLSchema">
<biid>
311
</biid>
<addComment>
<p><a target="_blank" href="http://www.test.com">http://www.test.com</a> works another www.test.com doesn&#39;t work</p>
</addComment>
</comment>
第一个www.test.com是超链接,第二个www.test.com不是。我怎样才能实现两者都是超链接?
答案 0 :(得分:0)
如果您要在提供的字符串中处理多个网址,则必须使用递归模板。
这是一个简单的例子,您可以将其作为起点:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="addComment">
<xsl:copy>
<xsl:call-template name="URLs-to-links">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="URLs-to-links">
<xsl:param name="text"/>
<xsl:param name="open" select="'www.'"/>
<xsl:param name="close" select="' '"/>
<xsl:choose>
<xsl:when test="contains($text, $open) and contains(substring-after($text, $open), $close)">
<xsl:value-of select="substring-before($text, $open)"/>
<xsl:text><a target="_blank" href="</xsl:text>
<xsl:value-of select="$open"/>
<xsl:value-of select="substring-before(substring-after($text, $open), $close)"/>
<xsl:text>"></xsl:text>
<xsl:value-of select="$open"/>
<xsl:value-of select="substring-before(substring-after($text, $open), $close)"/>
<xsl:text></a> </xsl:text>
<!-- recursive call -->
<xsl:call-template name="URLs-to-links">
<xsl:with-param name="text" select="substring-after(substring-after($text, $open), $close)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>