XSLT模板匹配带命名空间的ContractSummary实现Offerings按Type排序
问题根因
你的XML中ContractSummary声明了默认命名空间ContractSummary,其下所有子节点(Offerings、Type、Name)都自动继承该命名空间。你当前的模板仅匹配了ContractSummary节点,但查询子节点时未指定命名空间,导致无法找到对应Offerings节点,最终输出为空。
修正后的XSLT代码
<!-- 通用身份转换模板,保证所有节点、属性、文本原样复制 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配带命名空间的ContractSummary节点 --> <xsl:template match="//*[local-name()='ContractSummary' and namespace-uri()='ContractSummary' ]"> <xsl:copy> <!-- 复制当前节点的所有属性,保留xsi等命名空间声明 --> <xsl:copy-of select="@*"/> <!-- 明确选择同命名空间下的Offerings节点,按Type排序 --> <xsl:apply-templates select="*[local-name()='Offerings' and namespace-uri()='ContractSummary']"> <xsl:sort select="*[local-name()='Type' and namespace-uri()='ContractSummary']" /> </xsl:apply-templates> </xsl:copy> </xsl:template>
修改说明
- 新增了通用身份转换模板,确保匹配到的子节点、属性、文本内容可以正常复制输出
- 调整
xsl:apply-templates的选择规则,明确指定匹配与ContractSummary同命名空间的Offerings节点 - 调整排序规则的取值路径,明确指定匹配同命名空间下的Type节点作为排序依据
- 新增
xsl:copy-of select="@*"保留ContractSummary节点原有的所有属性,包括xsi命名空间声明和schemaLocation属性
内容的提问来源于stack exchange,提问作者Idur Jul
相关产品推荐
相关产品推荐

