如何使用XSLT根据元素属性值转换XML元素名称?
解决方案
以下是修正后的XSLT代码,可实现你需要的转换效果:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:L7j="http://ns.l7tech.com/2012/08/jdbc-query-result"> <xsl:output method="xml" indent="yes"/> <!-- 身份模板:默认复制所有节点 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 针对L7j:col元素的自定义转换 --> <xsl:template match="L7j:col"> <xsl:element name="{@name}"> <xsl:value-of select="."/> </xsl:element> </xsl:template> </xsl:stylesheet>
关键修正说明:
- 修复命名空间不匹配:原XSLT中使用的
https://ns.l7tech.com/2012/08/jdbc-query-result与XML输入中的http://...命名空间不一致,修正为相同值确保元素能被正确匹配。 - 替换L7j:col元素:新增专门模板匹配
<L7j:col>,将其替换为名称取自name属性的新元素,仅保留原元素的文本内容,忽略type等其他无关属性。 - 保留原有结构:通过身份模板自动复制未被自定义模板匹配的节点(如
<L7j:jdbcQueryResult>和<L7j:row>),维持原XML的整体层级结构。
转换后输出:
<?xml version="1.0" encoding="UTF-8"?> <L7j:jdbcQueryResult xmlns:L7j="http://ns.l7tech.com/2012/08/jdbc-query-result"> <L7j:row> <firstname>Stefan</firstname> <lastname>McLovin</lastname> <age>21</age> <year>3</year> <id>0001</id> </L7j:row> <L7j:row> <firstname>Kevin</firstname> <lastname>McCool</lastname> <age>25</age> <year>4</year> <id>0002</id> </L7j:row> </L7j:jdbcQueryResult>
内容的提问来源于stack exchange,提问作者Stefan Meeuwessen
相关产品推荐
相关产品推荐

