我需要在客户端用xslt 1.0拆分逗号分隔的字符串....这样的事情可能吗?
我尝试过像
这样的方法我在firefox上遇到错误,说它检测到了递归并且在那里停止了。我的问题是我从我的SQL服务器返回数据作为XML并且存在1对多关系,1个博客帖子记录带有多个“标签”[即#cars]。所以我将“标签”添加为xml标签内的逗号分隔字段,我想在客户端再次拆分它。或者,如果有一些方法可以简单地从SQL Server XML创建一个嵌套的字段列表,也可以使用
即代替“汽车,红色,2010”,我可以返回
<tags>
<tag>cars</tag>
<tag>red</tag>
<tag>2010</tag>
</tags>
我在浏览器上使用MS SQL Server 2008,ASP.NET 4.0和XSLT 1.0,因此这些是我可以使用的工具。提前谢谢!
答案 0 :(得分:3)
人们是正确的,可以在服务器端生成XML,但是如果您决定延迟这一代,那么以下是如何使用XSLT1.0在客户端上执行此操作(XSLT 2.0)可以使用XPath 2.0标准函数tokenize()
,但今天的浏览器不直接支持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:strip-space elements="*"/>
<xsl:template match="/*">
<tags>
<xsl:apply-templates/>
</tags>
</xsl:template>
<xsl:template match="text()" name="split">
<xsl:param name="pText" select="."/>
<xsl:param name="pDelim" select="', '"/>
<xsl:param name="pTagName" select="'tag'"/>
<xsl:if test="string-length($pText) >0">
<xsl:element name="{$pTagName}">
<xsl:value-of select=
"substring-before(concat($pText, $pDelim), $pDelim)"/>
</xsl:element>
<xsl:call-template name="split">
<xsl:with-param name="pText" select=
"substring-after($pText, $pDelim)"/>
<xsl:with-param name="pDelim" select="$pDelim"/>
<xsl:with-param name="pTagName" select="$pTagName"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(您提供的字符串包含在顶部元素中,以使其成为格式良好的XML文档,以便可以使用XSLT处理): / p>
<t>cars, red, 2010</t>
产生了想要的正确结果:
<tags>
<tag>cars</tag>
<tag>red</tag>
<tag>2010</tag>
</tags>
请注意:此解决方案的通用性 - 文本,分隔字符串和“标记名”都指定为参数。
答案 1 :(得分:0)
如果您将数据保存为XML (即不将HTML拆分为逗号分隔列表),您可以直接使用数据。
declare @data as XML
set @data = '<tags>'
+ '<tag>cars</tag>'
+ '<tag>red</tag>'
+ '<tag>2010</tag>'
+ '</tags>'
SELECT tag.value('text()[1]', 'varchar(50)') as 'tags'
FROM @data.nodes('/tags/tag') AS tags(tag)