如何用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>
</xsl:text> </xsl:template> <!-- 忽略所有文本节点(包括空白),避免多余输出 --> <xsl:template match="text()" /> </xsl:transform>
代码说明
- 精准匹配目标节点:
match="*[not(*)]"确保只处理没有子元素的元素,也就是最终承载内容的节点,这样就不会输出中间层级的空路径。 - 过滤无效节点:新增的
match="text()"模板会跳过所有文本节点(包括XML里的换行、缩进空白),避免产生多余的空行或无效输出。 - 文本值优化:用
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
相关产品推荐
相关产品推荐

