【问题标题】:Splitting a string with xslt clientside使用 xslt 客户端拆分字符串
【发布时间】:2024-04-29 09:50:02
【问题描述】:

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

我尝试了类似的方法

* Solution

我在 firefox 上收到一个错误,说它检测到递归并停在那里。我的问题是我从我的 SQL 服务器以 XML 形式返回数据,并且存在一对多的关系,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,所以这些都是我可用的工具。提前致谢!

【问题讨论】:

  • 使用 XSLT 1.0 解析字符串,然后将结果作为节点操作需要 EXSLT避免超出客户端 XSLT 的限制。相反,使用 MSSQL 的强大功能来制作 XML,使客户端能够轻松处理它。这当然是可能的,但是您并没有给出任何关于您的表和数据是什么样子的指示,所以这里没有任何建议,只是暗示这是要走的路。
  • 如果您决定在客户端拆分分隔字符串,您可以尝试使用 javascript 而不是 XSLT:exslt.org/str/functions/tokenize/str.tokenize.js
  • 不要使用浏览器内置处理器执行转换。
  • 好问题,+1。有关完整且通用的 XSLT 1.0 解决方案,请参阅我的答案。

标签: .net sql xml tsql xslt


【解决方案1】:

人们说的没错,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 处理):

<t>cars, red, 2010</t>

产生想要的正确结果

<tags>
   <tag>cars</tag>
   <tag>red</tag>
   <tag>2010</tag>
</tags>

注意:此解决方案的通用性——文本、分隔字符串和“标记名”都指定为参数。

【讨论】:

    【解决方案2】:

    如果您将数据保留为 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)
    

    【讨论】: