Назначьте класс CSS тегам HTML, сгенерированным с помощью SQL «FOR XML»

Я получаю строки таблицы и данные таблицы (с тегами HTML) из SQL, используя «ДЛЯ XML». Есть ли способ назначить классы CSS тегам html в SQL?

Что я сейчас получаю: <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>


person singhsac    schedule 17.05.2013    source источник


Ответы (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>

person singhsac    schedule 10.10.2013
comment
Ваш код был бы яснее, если бы вы заменили эти самые внутренние ссылки select for XML path('') опцией as [td]. (Кроме того, ознакомьтесь с режимом EXPLICIT. Синтаксис более сложен, но в зависимости от вашей окончательной реализации это может привести к более чистому коду.) - person DougM; 12.10.2013

Используя 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-данные для вас, а затем преобразовывать их в требуемый HTML-код посредством XSL-преобразования вне сервера. У вас будут более чистые запросы, немного меньшая нагрузка на ваш сервер и гораздо лучшее разделение проблем, если вы это сделаете.


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>
person DougM    schedule 17.05.2013
comment
ДугМ, спасибо за ответ. Проверьте ответ, который я только что опубликовал. - person singhsac; 11.10.2013

Я хотел решить аналогичную проблему, в которой создавать классы 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
person Keith Harris    schedule 19.02.2014

Используйте «FOR XML RAW('tr'), ELEMENTS» для последней строки кода for, например:

ВЫБЕРИТЕ [Имя] как td, [Значение] как td ИЗ таблицы FOR XML RAW('tr'), ЭЛЕМЕНТЫ

Спасибо

person Deisbel R Diaz    schedule 16.08.2017