如何通过XSLT修改XML的g父元素名称以包含指定子元素文本?
解决方案
没问题,我来帮你搞定第二个需求!只需要在现有XSLT中添加一个专门处理<g>元素的模板,覆盖默认的identity模板行为即可。下面是修改后的完整样式表:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> <!-- 保留默认的identity模板,用于复制未被专门模板匹配的节点 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()" /> </xsl:copy> </xsl:template> <xsl:variable name="lowerCase" select="'abcdefghijklmnopqrstuvwxyz'" /> <xsl:variable name="upperCase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> <!-- 新增:处理<g>元素的模板,重命名为g+A/B列的文本 --> <xsl:template match="g"> <xsl:element name="g{column[@name='A/B']}"> <xsl:apply-templates select="node()" /> </xsl:element> </xsl:template> <!-- 保留原有处理<column>的模板,转换name属性为元素名 --> <xsl:template match="column"> <xsl:element name="{translate(translate(@name,'/','_'), $upperCase,$lowerCase)}"> <xsl:apply-templates /> </xsl:element> </xsl:template> </xsl:stylesheet>
关键改动说明:
- 新增
<g>元素处理模板:- 使用
<xsl:element>动态生成新元素名,规则是g拼接当前<g>子节点中name="A/B"的<column>元素的文本内容(比如Test_1就会生成gTest_1) - 通过
<xsl:apply-templates select="node()" />继续处理<g>内部的子节点(也就是原来的<column>元素,走已有的转换逻辑)
- 使用
- 原有
<column>的转换逻辑完全保留,确保name="A/B"转成<a_b>、name="C/D"转成<c_d>的功能正常
验证效果:
用这个样式表处理你的原始XML,会生成你期望的输出:
<?xml version='1.0' encoding='UTF-8'?> <c version="0.1"> <f> <gTest_1> <a_b>Test_1</a_b> <c_d>NA</c_d> </gTest_1> <gTest_2> <a_b>Test_2</a_b> </gTest_2> <gTest_3> <a_b>Test_3</a_b> </gTest_3> </f> </c>
内容的提问来源于stack exchange,提问作者tosspot
相关产品推荐
相关产品推荐

