SQL Server中导入解析XSLT文件,提取指定节点值
处理XSLT文件导入SQL Server的查询语句
XSLT文件自带xsl标准命名空间,必须在SQL查询中声明该命名空间才能正确解析节点。以下是针对常见XSLT结构的查询实现:
假设你的XSLT结构示例
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <DataItem> <AType>User</AType> <SGroup>Admin</SGroup> <QID>Q_001</QID> <RID>R_001</RID> <RData> <xsl:value-of select="DbSchema.UserInfo/UserName"/> <xsl:value-of select="DbSchema.UserInfo/Email"/> </RData> </DataItem> </xsl:template> </xsl:stylesheet>
对应的SQL查询语句
假设你已将XSLT文件存储在表LegacyXSLTFiles的XSLTContent列(XML类型)中:
-- 声明XML命名空间,包含XSLT标准命名空间和默认命名空间 WITH XMLNAMESPACES ( DEFAULT '', 'http://www.w3.org/1999/XSL/Transform' AS xsl ) SELECT -- 提取基础节点的文本值 Item.value('(AType/text())[1]', 'NVARCHAR(100)') AS AType, Item.value('(SGroup/text())[1]', 'NVARCHAR(100)') AS SGroup, Item.value('(QID/text())[1]', 'NVARCHAR(100)') AS QID, Item.value('(RID/text())[1]', 'NVARCHAR(100)') AS RID, -- 提取RData下所有xsl:value-of的select属性值(多值用逗号分隔) STUFF( ( SELECT ', ' + ValueOfNode.value('@select', 'NVARCHAR(255)') FROM Item.nodes('RData/xsl:value-of') AS ValueOf(ValueOfNode) FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '' ) AS RData_SelectAttributes FROM LegacyXSLTFiles CROSS APPLY -- 根据实际XSLT结构调整节点路径,此处匹配xsl:template下的DataItem节点 XSLTContent.nodes('//xsl:template/DataItem') AS T(Item)
调整说明
- 若目标节点(AType、SGroup等)所在层级不同,修改
nodes()中的XPath路径即可,比如节点直接在xsl:stylesheet下,改为XSLTContent.nodes('//DataItem') - 若
RData下只有单个xsl:value-of标签,可简化为Item.value('(RData/xsl:value-of/@select)[1]', 'NVARCHAR(255)'),无需使用STUFF拼接 - 若XSLT包含其他自定义命名空间,需在
XMLNAMESPACES块中添加对应声明,例如'http://your-custom-namespace.com' AS ns,后续XPath中用ns:节点名访问
内容的提问来源于stack exchange,提问作者iFreeman72
相关产品推荐
相关产品推荐

