我正在尝试调试一些xsl代码,这些代码将从XML Document收集的链接及其描述放在列表中,它似乎正在工作,除非处理从单个字符串收集的多个链接,这些链接用“|”分隔和“^”符号。
包含此代码的XML Line与此非常相似:
<WebContent>
<content_type_desc>Links</content_type_desc>
<content_value>Google|http://www.google.com^Yahoo|http://www.yahoo.com^Bing|Http://www.bing.com</content_value>
</WebContent>
处理此问题的xsl就像
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="html" indent="yes" encoding="utf-8"/>
<xsl:template match="/">
<!--Links-->
<xsl:variable name="links" select="//WebContent[content_type_desc='Links']/content_value "/>
<!--Links-->
<!--Links section-->
<xsl:if test="$links != ''">
<br />
<xsl:choose>
<xsl:when test="contains($links,'^')">
<xsl:variable name="URL" select="substring-after(substring-before($links,'^'),'|')"/>
<xsl:variable name="URLText" select="substring-before($links,'|')"/>
<strong>Links: </strong><br />
<a href="$URL" target="_blank"><xsl:value-of select="$URLText"/></a>
<br />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="URL" select="substring-after($links,'|')"/>
<xsl:variable name="URLText" select="substring-before($links,'|')"/>
<strong>Links: </strong><br />
<a href="{$URL}" target="_blank"><xsl:value-of select="$URLText"/></a>
<br />
</xsl:otherwise>
</xsl:choose>
<br />
</xsl:if>
<!--Links section-->
</xsl:template>
</xsl:stylesheet>
这有什么问题,它只输出
<a href="http://www.google.com>Google</a>
当我希望输出
时<a href="http://www.google.com>Google</a>
<a href="http://www.yahoo.com>Yahoo</a>
<a href="http://www.bing.com>Bing</a>
任何帮助将不胜感激,因为这让我完全难过。
答案 0 :(得分:2)
假设您实际上只使用XSLT 1.0,为了解决这个问题,您可以使用递归调用的命名模板。
目前,代码仅处理代码中第一个^
之前的URL。您可以做的是将检查链接变量的主要代码放在命名模板中。然后,在URL确实包含^
时运行的 xsl:when 条件中,添加对命名模板的递归调用,但仅传递{{1}之后的子字符串}。
试试这个XSLT
^
答案 1 :(得分:0)
鉴于您已将问题标记为经典ASP,您的XSLT处理器很可能是某些版本的MSXML,其中有http://www.exslt.org/str/functions/tokenize/index.html的实现,因此您可以使用它。