如何将类名或样式名添加到使用 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 标记中的主要内容,如果未能解决你的问题,请参考以下文章

jQuery的属性与样式之增加样式.addClass(),删除样式.removeClass()

用JS添加和删除class类名

将类名添加到 React 根组件或更改结构

Angular将样式标签添加到innerHTML

您将如何使用与参数的类名相同的名称添加时间偏移

添加 UIButton 目标时“类名没有成员函数名”