如何用单份XSLT 1.0处理含相似标签的两类XML文件
XSLT 1.0 适配两种XML结构提取内容方案
针对你遇到的两种XML仅部分标签名含不同子串的情况,直接用contains()函数匹配标签名即可实现通用提取,以下是可直接使用的XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <!-- 匹配XML根节点,启动处理流程 --> <xsl:template match="/"> <!-- 定位顶层的responseXXXXcontent或responseYYYYcontent节点 --> <xsl:apply-templates select="*[contains(name(), 'XXXX') or contains(name(), 'YYYY')]"/> </xsl:template> <!-- 处理顶层的可变名称节点 --> <xsl:template match="*[contains(name(), 'XXXX') or contains(name(), 'YYYY')]"> <!-- 利用固定的中间节点路径,定位到finalcontentXXX下的name节点并输出内容 --> <xsl:value-of select="contentonedeep/contenttwodeep/*[contains(name(), 'XXXX') or contains(name(), 'YYYY')]/name"/> </xsl:template> </xsl:stylesheet>
关键语法说明
name()函数:用于获取当前节点的标签名,比如对<responseXXXXcontent>节点调用name()会返回字符串responseXXXXcontent。contains()函数:判断第一个参数的字符串是否包含第二个参数的子串,contains(name(), 'XXXX')即可匹配所有标签名含XXXX的节点。- 路径定位:因为
<contentonedeep>和<contenttwodeep>的标签名是固定的,所以可以直接用层级路径定位,无需额外判断。
简化写法(如果确保文档中只有一个<name>节点)
如果你的XML结构里只会有一个<name>节点,也可以用更简洁的路径直接提取:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/"> <xsl:value-of select="//name"/> </xsl:template> </xsl:stylesheet>
这种写法更简单,但如果文档中有多个<name>节点,会输出所有节点的内容,所以优先推荐第一种精准定位的写法。
内容的提问来源于stack exchange,提问作者Damian Szarik Paul
相关产品推荐
相关产品推荐

