Sql Server创建html标签

时间:2016-08-30 08:48:42

标签: html sql sql-server xml tsql

我从存储过程生成html,但它将html标签编码为'<','>'或'&'。我生成它们时需要标签。我试过[CDATA],但没有得到我预期的结果。

select '<ul class=''downloaditems-grid''>'+(
                select stuff(
                (
                    select  '<li>'+ convert(nvarchar(max),Filepath) +'</li>'
                        from(
                        select ('<p>'+UploadDocumentName+'</p><a target=''_blank'' class=''ml10'' href='''+DocumentFilePath+'''title=''Download''>') As Filepath from table1 CLRD 
                         where                      
                        isnull(CLRD.IsDeleted,0) <> 1   and orderid=2
                 ) 
             as T for xml path('')),1,2,'')) +' </ul>'   a

返回

<ul class='downloaditems-grid'>t;li&gt;&lt;P&gt;bill.png&lt;/&gt;&lt;a target='_blank' class='ml10' href='2c0a7c0c-d228-4f5d-9a8f-eb32911509db.png'title='Download'&gt;&lt;/li&gt; </ul>

但我的要求是:

<ul class='downloaditems-grid'>
<li><p>bill.png</p>
<a target='_blank' class='ml10' href='2c0a7c0c-d228-4f5d-9a8f-eb32911509db.png' title='Download'>
</a>
</li>
</ul>

表格结构

enter image description here

任何人都可以提供一些提示,除了在创建html标签时使用替换我如何解码?

3 个答案:

答案 0 :(得分:3)

您的“生成的”XML在多个观点中无效......

使用SQL Server,您可以轻松地创建有效的 XHTML ,如下所示:

SELECT 'downloaditems-grid' AS [@class]
      ,'bill.png' AS [li/p]
      ,'_blank' AS [li/a/@target]
      ,'ml10' AS [li/a/@class]
      ,'2c0a7c0c-d228-4f5d-9a8f-eb32911509db.png' AS [li/a/@href]
      ,'Download' AS [li/a/@title]
FOR XML PATH('ul')

结果(看起来与你试过的那个非常相似

<ul class="downloaditems-grid">
  <li>
    <p>bill.png</p>
    <a target="_blank" class="ml10" href="2c0a7c0c-d228-4f5d-9a8f-eb32911509db.png" title="Download" />
  </li>
</ul>

请注意 HTML很脏绝对不同于XHTML

简短说明:

XML中,标签与属性名称和内容之间存在明显的分离。有些字符是出于明确原因而绝对禁止的(<, > and &并且许多特殊字符与字符串编码结合会导致意外结果。标签和属性有明确的限制。内容可能是任何内容,但是:内容将需要正确转义,因此您的禁用字符转换为xml实体

CDATA无法帮助您,因为FOR XML PATH不支持{尽管有EXPLICIT ...),但无论如何,CDATA无法解决您的问题,即使有效......

您的串联xml字符串在许多观点上都无效(例如</>或缺少空白...)

UPDATE用于表数据

以下是与表数据一起使用的代码。请注意,我在第3行添加了禁用字符!

DECLARE @tbl TABLE(DocumentFilePath VARCHAR(100),UploadDocumentName VARCHAR(100));
INSERT INTO @tbl VALUES
 ('File1.png','This is file 1')
,('File2.png','This is file 2')
,('File&3.png','This is file 3& with forbidden <>!!')

SELECT 'downloaditems-grid' AS [@class]
      ,(
        SELECT
           'bill.png' AS [p]
          ,'_blank' AS [a/@target]
          ,'ml10' AS [a/@class]
          ,tbl.DocumentFilePath AS [a/@href]
          ,tbl.UploadDocumentName AS [a/@title]
      FROM @tbl AS tbl
      FOR XML PATH('li'),TYPE
       )
FOR XML PATH('ul')

这是结果

<ul class="downloaditems-grid">
  <li>
    <p>bill.png</p>
    <a target="_blank" class="ml10" href="File1.png" title="This is file 1" />
  </li>
  <li>
    <p>bill.png</p>
    <a target="_blank" class="ml10" href="File2.png" title="This is file 2" />
  </li>
  <li>
    <p>bill.png</p>
    <a target="_blank" class="ml10" href="File&amp;3.png" title="This is file 3&amp; with forbidden &lt;&gt;!!" />
  </li>
</ul>

答案 1 :(得分:1)

嗨,你的代码使用了这个:

replace( replace( @body, '&lt;', '<' ), '&gt;', '>' )

答案 2 :(得分:1)

首先,你的标记是错误的。它应该是'<P>'+UploadDocumentName+'</P><a target=''_blank'' class=''ml10'' href='''+DocumentFilePath+''' title=''Download''/>' 使用常规XML构建功能

    select        
       [ul/@class]='downloaditems-grid',
       [ul]=(
       select [P]=UploadDocumentName,
                [a/@target]='_blank',
                [a/@class] ='ml10',
                [a/@href]=DocumentFilePath,
                [a/@title]='Download' 
       from ( 
              -- sample data
              values
               ('123','ad/df')
              ,('456','xx/yy')
            ) CLRD (UploadDocumentName, DocumentFilePath)
       for xml path('li'), type
       )
for xml path('')