You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用XSLT将通用XML转换为以元素绝对路径为键的属性文件?

解决XML转属性文件(绝对路径=值)的XSLT问题

我看了你的需求和现有XSLT代码,问题出在模板匹配范围太广——你当前的模板匹配所有node(),包括非叶子元素、空白文本节点,这就导致输出了很多你不需要的行(比如/group=、/group/root=这类没有实际值的路径),还会引入多余的空白行。

咱们来修正一下,只针对包含文本值的叶子元素(也就是没有子元素的元素)生成属性行:

修正后的XSLT代码

<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" />
  
  <!-- 匹配所有元素,但只处理没有子元素的叶子节点 -->
  <xsl:template match="*[not(*)]">
    <!-- 拼接元素的绝对路径 -->
    <xsl:for-each select="ancestor-or-self::*">
      <xsl:value-of select="concat('/', name(.))"/>
    </xsl:for-each>
    <!-- 拼接=和元素的文本值,trim掉多余空白(可选) -->
    <xsl:value-of select="concat('=', normalize-space(.))"/>
    <!-- 换行符 -->
    <xsl:text>&#xA;</xsl:text>
  </xsl:template>
  
  <!-- 忽略所有文本节点(包括空白),避免多余输出 -->
  <xsl:template match="text()" />
</xsl:transform>

代码说明

  1. 精准匹配目标节点:match="*[not(*)]" 确保只处理没有子元素的元素,也就是最终承载内容的节点,这样就不会输出中间层级的空路径。
  2. 过滤无效节点:新增的match="text()"模板会跳过所有文本节点(包括XML里的换行、缩进空白),避免产生多余的空行或无效输出。
  3. 文本值优化:用normalize-space()可以自动去除文本前后的空白并压缩中间空格,如果你的场景需要保留原始文本(比如有刻意的空格),可以直接换成concat('=', .)。

用这个XSLT处理你给出的XML,就能得到你期望的属性文件输出:

/group/root/child/subchild=xyz
/group/root1/child/subchild=abc
/group/root2/child/subchild=pqr
/group/root3/child/subchild=lmn

内容的提问来源于stack exchange,提问作者Indrajeet Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:11:23