如何将类名或样式名添加到使用 SQL 'FOR XML' 生成的 HTML 标记中
Posted
技术标签:
【中文标题】如何将类名或样式名添加到使用 SQL \'FOR XML\' 生成的 HTML 标记中【英文标题】:How to add class name or style name to HTML tags generated with SQL 'FOR XML'如何将类名或样式名添加到使用 SQL 'FOR XML' 生成的 HTML 标记中 【发布时间】:2021-12-07 16:33:55 【问题描述】:我有以下查询以分层方式选择菜单并显示在 asp.net 网页中,
在我得到<li><a href="#">Products</a></li>
的输出中,我需要将输出转换如下
<li><a href="#" class="collapse"><i><img src="images/dashboard-normal.png"></i><span>Products</span></a></li>
即,我需要包含类名,需要在li中包含图像标签,需要添加span标签(在我当前的输出中没有类名,图像标签)
谁能帮我实现这个目标?
CREATE FUNCTION dbo.fn_menuXML( @IDMenuParent INT )
RETURNS XML
WITH RETURNS NULL ON NULL INPUT
BEGIN RETURN
(
SELECT
NavigateUrl AS "a/@href",
DisplayText AS "a",
CASE WHEN MenuParentID = @IDMenuParent
THEN dbo.fn_menuXML( MenuID )
END
FROM SFM_Menu
WHERE MenuParentID = @IDMenuParent
FOR XML PATH('li'), ROOT('ul'), TYPE
)
END
GO
SELECT
NavigateUrl AS "a/@href",
DisplayText AS "a",
dbo.fn_menuXML(MenuID)
FROM SFM_Menu
WHERE MenuParentID =0
AND IsActive=1
ORDER BY DisplayOrder
FOR XML PATH('li'), ROOT('ul'), TYPE
请在下面找到架构和数据,
DECLARE @Menu TABLE
(
MenuID INT,
MenuParentID INT,
DisplayText NVARCHAR(100),
NavigateUrl NVARCHAR(255),
ImageUrl NVARCHAR(255),
IsActive int,
DisplayOrder bit
);
INSERT INTO @Menu VALUES (1, 0, 'Products', 'Products.aspx','Sample.png',1,1) ,
(2, 1, 'Add Products', 'AddProducts.aspx','Sample.png',1,1),
(3, 1, 'Update Products', 'UpdateProducts.aspx','Sample.png',1,2),
(4, 1, 'Product Type', 'ProductType.aspx','Sample.png',1,3),
(5, 4, 'Logistics', 'Logistics.aspx','Sample.png',1,1),
(9, 0, 'Department', '#','Sample.png',1,2),
(10, 9, 'Clothing', 'Clothing.aspx','Sample.png',1,1),
(11, 9, 'Dresses', 'Dresses.aspx','Sample.png',1,1),
(12, 9, 'Accessories', 'Accessories.aspx','Sample.png',1,3),
(13, 0, 'Site Management', '#','Sample.png',1,3),
(14, 13, 'Security', 'Security.aspx','Sample.png',1,1) ,
(6, 4, 'Food Items', 'FoodItems.aspx','Sample.png',1,1),
(7, 6, 'Veg', 'Veg.aspx','Sample.png',1,1) ,
(8, 6, 'Non Veg', 'NonVeg.aspx','Sample.png',1,2) ;
输出应该是这样的,
<ul>
<li>
<a href="Products.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Products</span>
</a>
<ul>
<li>
<a href="AddProducts.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Add Products</span>
</a>
</li>
<li>
<a href="UpdateProducts.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Update Products</span>
</a>
</li>
<li>
<a href="ProductType.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Product Type</span>
</a>
<ul>
<li>
<a href="Logistics.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Logistics</span>
</a>
</li>
<li>
<a href="FoodItems.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Food Items</span>
</a>
<ul>
<li>
<a href="Veg.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Veg</span>
</a>
</li>
<li>
<a href="NonVeg.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Non Veg</span>
</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Department</span>
</a>
<ul>
<li>
<a href="Clothing.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Clothing</span>
</a>
</li>
<li>
<a href="Dresses.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Dresses</span>
</a>
</li>
<li>
<a href="Accessories.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Accessories</span>
</a>
</li>
</ul>
</li>
<li>
<a href="#" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Site Management</span>
</a>
<ul>
<li>
<a href="Security.aspx" class="collapse">
<i>
<img src="images/dashboard-normal.png" />
</i>
<span>Security</span>
</a>
</li>
</ul>
</li>
</ul>
【问题讨论】:
也许一个 SQL 替换函数可以解决问题,用它的值替换 href 标签,并附加你需要的类和其他标签。 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。 所需的输出 (X)html 格式不正确。请也修复它。 @YitzhakKhabinsky 我已经根据您的 cmets 添加了数据和架构,在此先感谢 为什么不直接从数据库中返回数据并使用 asp.net 从中创建 html?然后每个部分都做它最擅长的事情 【参考方案1】:请尝试以下解决方案。
它是使用递归CTE来构造一个基于指定父节点的菜单。
不清楚从哪里获取图片链接。
SQL
-- DDL and sample data population, start
DECLARE @Menu TABLE
(
MenuID INT,
MenuParentID INT,
DisplayText NVARCHAR(100),
NavigateUrl NVARCHAR(255),
IsActive int,
DisplayOrder bit
);
INSERT INTO @Menu VALUES
(1, 0, 'Products', 'Products.aspx',1,1) ,
(2, 1, 'Add Products', 'AddProducts.aspx',1,1),
(3, 1, 'Update Products', 'UpdateProducts.aspx',1,2),
(4, 1, 'Product Type', 'ProductType.aspx',1,3),
(5, 4, 'Logistics', 'Logistics.aspx',1,1),
(9, 0, 'Department', '#',1,2),
(10, 9, 'Clothing', 'Clothing.aspx',1,1),
(11, 9, 'Dresses', 'Dresses.aspx',1,1),
(12, 9, 'Accessories', 'Accessories.aspx',1,3),
(13, 0, 'Site Management', '#',1,3),
(14, 13, 'Security', 'Security.aspx',1,1) ,
(6, 4, 'Food Items', 'FoodItems.aspx',1,1),
(7, 6, 'Veg', 'Veg.aspx',1,1),
(8, 6, 'Non Veg', 'NonVeg.aspx',1,2);
-- DDL and sample data population, end
DECLARE @IDMenuParent INT = 0;
-- Find all child nodes of the specified parent node
-- just to see
;WITH Hierarchy AS
(
SELECT Path=CAST(T1.DisplayText + '/' AS VARCHAR(1000)), Level=1, T1.MenuID,T1.MenuParentID,T1.DisplayText, T1.NavigateUrl
FROM @Menu T1
WHERE T1.MenuParentID = @IDMenuParent
UNION ALL
SELECT Path=CAST(TH.Path + T1.DisplayText + '/' AS VARCHAR(1000)),Level=TH.Level+1, T1.MenuID,T1.MenuParentID,T1.DisplayText, T1.NavigateUrl
FROM @Menu T1 INNER JOIN
Hierarchy TH ON TH.MenuID = T1.MenuParentID
)
SELECT * FROM Hierarchy
ORDER BY MenuID;
-- real deal
;WITH Hierarchy AS
(
SELECT Path=CAST(T1.DisplayText + '/' AS VARCHAR(1000)), Level=1, T1.MenuID,T1.MenuParentID,T1.DisplayText, T1.NavigateUrl
FROM @Menu T1
WHERE T1.MenuParentID = @IDMenuParent
UNION ALL
SELECT Path=CAST(TH.Path + T1.DisplayText + '/' AS VARCHAR(1000)),Level=TH.Level+1, T1.MenuID,T1.MenuParentID,T1.DisplayText, T1.NavigateUrl
FROM @Menu T1 INNER JOIN
Hierarchy TH ON TH.MenuID = T1.MenuParentID
)
SELECT (
SELECT *
FROM Hierarchy
ORDER BY MenuID
FOR XML PATH('li'), TYPE, ROOT('ul')
).query('<ul>
for $x in /ul/li
return <li>
<a href="$x/NavigateUrl" class="collapse">
<i>
<img src="images/dashboard-normal.png"/>
</i>
<span>data($x/DisplayText)</span>
</a>
</li>
</ul>');
【讨论】:
我修好了。看看吧。 我又猜了,但你可以试试ORDER BY MenuID
。这就是我保留第一个 SELECT ...
的原因——只是为了查看评论。
我调整了答案中的排序顺序。请试一试。
@RageshSivakumar,你的最新消息是什么?
最后,您生成了#3,即所需的输出。我怀疑是否有可能通过 SQL Server XQuery 功能构造这样的 XML。以上是关于如何将类名或样式名添加到使用 SQL 'FOR XML' 生成的 HTML 标记中的主要内容,如果未能解决你的问题,请参考以下文章