如何使用XSLT将父Property元素重命名为Property加对应子Key值的格式
调整方案
你原有代码存在三个核心问题:未定义$key变量就调用、没有拼接「Property」前缀、未保留Property节点的子结构。下面提供两种可行实现:
完整可运行的XSLT实现(推荐,使用模板匹配更符合XSLT规范)
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 通用复制模板:所有不需要修改的节点和属性直接原样复制 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 单独匹配Data下的Property节点做重命名处理 --> <xsl:template match="Data/Property"> <!-- 直接用属性值模板拼接新节点名 --> <xsl:element name="Property{Key/text()}"> <!-- 复制当前Property下的所有子内容 --> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> </xsl:stylesheet>
基于你原有for-each写法的修改版
<xsl:for-each select="Data/Property"> <xsl:element name="Property{Key}"> <!-- 保留Property下的所有子节点 --> <xsl:copy-of select="node()"/> </xsl:element> </xsl:for-each>
核心逻辑说明
- 使用
{}属性值模板可以直接在属性中嵌入XPath表达式,无需额外定义变量存储Key值 - 不需要手动输出Key的值,直接复制原有子节点即可保留完整结构
- 两种写法都可以输出你预期的XML结果
内容的提问来源于stack exchange,提问作者keeskroket
相关产品推荐
相关产品推荐

