使用xslt客户端拆分字符串

时间:2011-06-21 05:54:12

标签: .net sql xml tsql xslt

我需要在客户端用xslt 1.0拆分逗号分隔的字符串....这样的事情可能吗?

我尝试过像

这样的方法

Stackoverflow Solution

我在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,因此这些是我可以使用的工具。提前谢谢!

2 个答案:

答案 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)