XSLT 2.0按公共子元素值分组输出及默认命名空间适配问题求解
XSLT默认命名空间匹配失败问题解决方案
问题原因
源XML定义了默认命名空间http://www.taleo.com/ws/integration/toolkit/2005/07,所有子节点默认都属于该命名空间。你虽然在XSLT中声明了to前缀映射该命名空间,但所有XPath匹配、选择表达式中的元素名没有加to前缀,XSLT会将其识别为无命名空间元素,无法匹配到源文件中的节点,导致转换不生效。
修正后的完整XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:to="http://www.taleo.com/ws/integration/toolkit/2005/07" xmlns:util="http://www.mavixconsulting.com/2013/XSL/transform" exclude-result-prefixes="to util"> <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> <!-- 匹配带命名空间的ExportXML节点 --> <xsl:template match="to:ExportXML"> <!-- 选择带命名空间的record节点分组 --> <xsl:for-each-group select="to:record" group-by="to:job_id"> <EF_Position> <!-- 手动构造无命名空间的job_id节点,避免带原命名空间输出 --> <job_id> <xsl:value-of select="to:job_id"/> </job_id> <title> <xsl:value-of select="to:title"/> </title> <coll1> <xsl:for-each select="current-group()"> <coll> <!-- 取当前组内带命名空间的coll节点值 --> <xsl:value-of select="to:coll"/> </coll> </xsl:for-each> </coll1> </EF_Position> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
关键修改点
- 所有匹配、选择源XML元素的XPath表达式前统一添加
to:前缀,和声明的命名空间映射对应,可正确识别源文件中的节点 - 将原
xsl:sequence直接复制节点的逻辑改为手动构造job_id元素,避免将源XML的命名空间带入输出结果,符合要求的输出格式 - 所有引用源节点值的
select属性都补充了to:前缀,可正确读取对应字段值
内容的提问来源于stack exchange,提问作者sandeep himgire
相关产品推荐
相关产品推荐

