3

我正在使用“FOR XML”从 SQL 获取表行和表数据(带有 HTML 标记)。有没有办法可以将 CSS 类分配给 SQL 中的 html 标签?

我目前得到的: <tr><td>Name</td><td>Value</td></tr>

SQL查询:

SELECT  (SELECT [Name] as [td] FOR XML PATH(''), type),
        (SELECT [Value] as [td] FOR XML PATH(''), type)
FROM    table
FOR XML PATH('tr')

期望的输出:

<tr class="test1"> <td class="test2">Name</td> <td class="test3">Value</td> </tr>

4

4 回答 4

4

我知道我正在回答我自己的问题,认为它可能对其他人有所帮助。

我将类作为属性添加到 XML 节点,这给了我所需的输出。

SELECT  'test1' AS [@class]
    , ( SELECT  'test2' as [@class]
        , (SELECT 'Name' FOR XML PATH(''))
        FOR XML PATH('td'), type)
    ,(SELECT  'test3' as [@class]
        , (SELECT 'Value' FOR XML PATH(''))
        FOR XML PATH('td'), type) 
FOR XML PATH('tr'), type


输出:
<tr class="test1"><td class="test2">Name</td><td class="test3">Value</td></tr>

于 2013-10-10T22:49:48.853 回答
0

我想解决一个类似的问题,即根据字段的值创建 tr 类,但给出的解决方案和 FOR EXPLICIT 都不起作用。我的项目使用 Data-Table 和 Twitter Bootstrap CSS 版本来设置 HTML 表格的样式。这是对我有用的解决方案:

DECLARE @tab varchar(max),
        @header varchar(8000),
        @fields varchar(8000),
        @sql varchar(8000)
DECLARE @rtab TABLE (html varchar(max))

SET @fields = '[field 1], [field 2], [field 3]'

SELECT @sql = 'WITH cte (SELECT * FROM table)
SELECT CAST ((
SELECT CASE 
  WHEN [CriteriaField] = ''Value1'' THEN ''error''
  WHEN [CriteriaField] = ''Value2'' THEN ''success''
  WHEN [CriteriaField] = ''Value3'' THEN ''warning''
  ELSE NULL END
AS [@class], (
SELECT ' + REPLACE(@fields, ',', ' AS td,') + ' AS td' + ' 
FOR XML RAW(''''), ELEMENTS)
FROM cte
FOR XML PATH(''tr'')) AS nvarchar(max))'

INSERT INTO @rtab EXEC(@sql)

SELECT @tab = @tab + REPLACE(REPLACE(REPLACE(REPLACE(html, '&lt;', '<'), '&gt;', '>'), '&amp;gt;', '>'), '&amp;lt;', '<')  --Restore SQL Server's replacement tags.  
SELECT @tab = REPLACE(@tab, '&amp;', '&') --Restore replacement ampersands (anchor links in the data)

SELECT @header = REPLACE(@fields, ',', '</th><th>')
SELECT @header = '<th>' + @header + '</th>'
SELECT @header = '<tr>' + @header + '</tr>'
SELECT @header = REPLACE(REPLACE(@header, '[', ''), ']', '')

SELECT @tab = '<thead>' + @header + '</thead><tbody>' + @tab + '</tbody></table>'
SELECT @tab = '<table id="data-table" class="table table-bordered">' + @tab
SELECT @tab
于 2014-02-19T09:16:10.680 回答
0

使用 T-SQL,您可以在 SQL 中指定属性路径。 相关 MSDN 页面 并且您可以将字段内容指定为当前行元素中具有正确名称的数据。

SELECT 'test1' as [@class],
      (SELECT [Name] as [*], 'test2' as [@class] FOR XML PATH('td'), type),
      (SELECT [Value] as [*], 'test3' as [@class] FOR XML PATH('td'), type)
FROM table
FOR XML PATH('tr') 

但是,如果可能的话,您应该让 SQL Server 为您生成 XML 数据,然后通过服务器外部的 XSL 转换将其转换为您的 HTML 需求。如果这样做,您将获得更清晰的查询,更少的服务器负载,以及更好的关注点分离。


T-SQL:

SELECT 
    Name , 
    Value 
FROM table 
FOR XML AUTO

像获取 XML

<table name="name" value="value" />

XSLT:

<xsl:template match="table">
    <tr class="test1">
        <td class="test2">
            <xsl:value-of select="@name" />
        </td>
        <td class="test3">
            <xsl:value-of select="@value" />
        </td>
    </tr>
</xsl:template>

结果在(X)HTML中

<tr class="test1">
    <td class="test2">Name</td>
    <td class="test3">Value</td>
</tr>
于 2013-05-17T00:57:12.660 回答
0

在代码的最后一行使用“FOR XML RAW('tr'), ELEMENTS”,如下所示:

SELECT [Name] as td, [Value] as td FROM table FOR XML RAW('tr'), ELEMENTS

谢谢

于 2017-08-16T21:25:41.233 回答