如何使用XSLT 1.0从动态复杂XML结构生成URL查询字符串
用XSLT 1.0实现通用XML到URL查询字符串的转换
当然可以通过XSLT 1.0实现这种动态通用的XML转URL查询字符串需求,下面是具体的转换样式表,能适配任意根节点下的子元素结构,自动过滤空元素:
<?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" encoding="UTF-8" indent="yes"/> <!-- 匹配XML根节点 --> <xsl:template match="/"> <result> <query> <!-- 遍历根节点下所有非空的子元素 --> <xsl:for-each select="*/*[normalize-space(text()) != '']"> <!-- 第一个参数前加?,后续参数加& --> <xsl:if test="position() > 1"> <xsl:text>&amp;</xsl:text> </xsl:if> <xsl:if test="position() = 1"> <xsl:text>?</xsl:text> </xsl:if> <!-- 拼接键值对:元素名=文本内容 --> <xsl:value-of select="concat(local-name(), '=', normalize-space(text()))"/> </xsl:for-each> </query> </result> </xsl:template> <!-- 忽略空文本节点,避免干扰 --> <xsl:template match="text()[normalize-space() = '']"/> </xsl:stylesheet>
关键逻辑说明
- 动态适配结构:通过
*/*匹配任意根节点下的所有子元素,无需提前指定元素名称,适配不同XML结构 - 过滤空元素:用
[normalize-space(text()) != '']筛选出有非空文本内容的元素,自动忽略空节点(如<age/>或<org_structure/>) - 参数拼接规则:
- 第一个有效参数前添加
?作为查询字符串起始符 - 后续参数用转义后的
&分隔(符合XML输出规范) - 用
normalize-space清理文本内容中的多余空格,保证参数值干净
- 第一个有效参数前添加
- 空文本处理:额外模板忽略空文本节点,避免生成无效的空格内容
验证示例
将示例1的XML输入该样式表,会输出:
<?xml version="1.0" encoding="UTF-8"?> <result> <query>?first_name=foo&amp;last_name=bar</query> </result>
示例2的XML输入后,输出:
<?xml version="1.0" encoding="UTF-8"?> <result> <query>?occupation=developer&amp;team=TECH</query> </result>
完全符合需求中的转换要求。
内容的提问来源于stack exchange,提问作者nikiforos6
相关产品推荐
相关产品推荐

