我从存储过程生成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><P>bill.png</><a target='_blank' class='ml10' href='2c0a7c0c-d228-4f5d-9a8f-eb32911509db.png'title='Download'></li> </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>
表格结构
任何人都可以提供一些提示,除了在创建html标签时使用替换我如何解码?
答案 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字符串在许多观点上都无效(例如</>
或缺少空白...)
以下是与表数据一起使用的代码。请注意,我在第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&3.png" title="This is file 3& with forbidden <>!!" />
</li>
</ul>
答案 1 :(得分:1)
嗨,你的代码使用了这个:
replace( replace( @body, '<', '<' ), '>', '>' )
答案 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('')