技术咨询:如何使用XSLT修改XML元素名称
用XSLT修改XML元素名称的解决方案
没问题,我来帮你搞定这个需求。咱们先从核心思路说起:XSLT修改元素名称的关键是匹配目标元素,然后输出新名称的元素,并保留原元素的属性和子节点。下面结合你提供的XML示例,给你写一个可直接复用的样式表。
第一步:明确修改规则
假设你想做这些修改(你可以根据实际需求调整):
<PARAM>→<ConfigurationParameter><RES>→<SearchResult><M>→<MatchCount><R>→<ResultItem><U>→<OriginalUrl><UE>→<EncodedUrl><UD>→<DisplayUrl><RK>→<RelevanceScore><MT>→<Metadata>
第二步:编写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="/"> <xsl:apply-templates/> </xsl:template> <!-- 修改<PARAM>为<ConfigurationParameter> --> <xsl:template match="PARAM"> <ConfigurationParameter> <xsl:copy-of select="@*"/> <!-- 复制所有属性 --> <xsl:apply-templates/> <!-- 处理子节点(如果有的话) --> </ConfigurationParameter> </xsl:template> <!-- 修改<RES>为<SearchResult> --> <xsl:template match="RES"> <SearchResult> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </SearchResult> </xsl:template> <!-- 修改<M>为<MatchCount> --> <xsl:template match="M"> <MatchCount> <xsl:apply-templates/> </MatchCount> </xsl:template> <!-- 修改<R>为<ResultItem> --> <xsl:template match="R"> <ResultItem> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </ResultItem> </xsl:template> <!-- 修改<U>为<OriginalUrl> --> <xsl:template match="U"> <OriginalUrl> <xsl:apply-templates/> </OriginalUrl> </xsl:template> <!-- 修改<UE>为<EncodedUrl> --> <xsl:template match="UE"> <EncodedUrl> <xsl:apply-templates/> </EncodedUrl> </xsl:template> <!-- 修改<UD>为<DisplayUrl> --> <xsl:template match="UD"> <DisplayUrl> <xsl:apply-templates/> </DisplayUrl> </xsl:template> <!-- 修改<RK>为<RelevanceScore> --> <xsl:template match="RK"> <RelevanceScore> <xsl:apply-templates/> </RelevanceScore> </xsl:template> <!-- 修改<MT>为<Metadata> --> <xsl:template match="MT"> <Metadata> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </Metadata> </xsl:template> <!-- 通用模板:复制所有未被上面模板匹配的元素(比如<XT>),保留原样 --> <xsl:template match="*"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> <!-- 复制文本节点、注释等,避免丢失内容 --> <xsl:template match="text()|comment()|processing-instruction()"> <xsl:copy/> </xsl:template> </xsl:stylesheet>
第三步:转换效果展示
把你提供的输入XML(补充完整闭合标签后):
<PARAM name="ulang" value="de" original_value="de"/> <PARAM name="wc" value="200" original_value="200"/> <PARAM name="wc_mc" value="1" original_value="1"/> <RES SN="1" EN="727"> <M>727</M> <XT/> <R N="1" L="1" MIME="text/plain"> <U>url</U> <UE>url</UE> <UD>url</UD> <RK>10</RK> <MT N="Content_Length" V="42"/> <MT N="url_id" V="005056A51FAC1EE0B9A3"/> </R> </RES>
经过上面的XSLT转换后,得到的输出XML是:
<ConfigurationParameter name="ulang" value="de" original_value="de"/> <ConfigurationParameter name="wc" value="200" original_value="200"/> <ConfigurationParameter name="wc_mc" value="1" original_value="1"/> <SearchResult SN="1" EN="727"> <MatchCount>727</MatchCount> <XT/> <ResultItem N="1" L="1" MIME="text/plain"> <OriginalUrl>url</OriginalUrl> <EncodedUrl>url</EncodedUrl> <DisplayUrl>url</DisplayUrl> <RelevanceScore>10</RelevanceScore> <Metadata N="Content_Length" V="42"/> <Metadata N="url_id" V="005056A51FAC1EE0B9A3"/> </ResultItem> </SearchResult>
关键说明
- 如果你需要修改其他元素名称,只需要新增对应的
<xsl:template match="原元素名">模板,替换成新元素即可。 - 通用模板确保了不需要修改的元素(比如
<XT>)会被原样复制,不用逐个写模板。 <xsl:copy-of select="@*"/>负责保留原元素的所有属性,如果你只想保留部分属性,可以改成<xsl:copy-of select="@name|@value"/>这样的写法。
内容的提问来源于stack exchange,提问作者Byakko
相关产品推荐
相关产品推荐

