You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询如何修改XSLT实现XML仅nfeProc元素带n0命名空间前缀

解决XSLT仅给指定元素添加命名空间前缀的问题

你原来的XSLT会移除所有元素的命名空间前缀,但现在需要仅给<nfeProc>元素添加n0前缀,同时保留两个命名空间声明(默认命名空间和n0前缀的命名空间),可以通过以下修改实现:

修改后的XSLT代码

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:n0="http://www.p.in.br/nf">
<xsl:output method="xml" indent="yes"/>

<!-- 专门匹配nfeProc元素,添加n0前缀和所需命名空间 -->
<xsl:template match="*[local-name()='nfeProc']">
  <n0:nfeProc xmlns="http://www.p.in.br/nf">
    <xsl:apply-templates select="@* | node()"/>
  </n0:nfeProc>
</xsl:template>

<!-- 处理其他元素:使用默认命名空间(不添加前缀) -->
<xsl:template match="*">
  <xsl:element name="{local-name(.)}" namespace="http://www.p.in.br/nf">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

<!-- 处理属性:保留原属性名称和值 -->
<xsl:template match="@*">
  <xsl:attribute name="{local-name(.)}">
    <xsl:value-of select="."/>
  </xsl:attribute>
</xsl:template>
</xsl:stylesheet>

代码改动说明

  • 先在样式表根节点声明n0命名空间,和目标命名空间保持一致:xmlns:n0="http://www.p.in.br/nf"
  • 新增专门匹配<nfeProc>元素的模板:直接生成带n0前缀的元素,同时在这个元素上声明默认命名空间xmlns="http://www.p.in.br/nf",这样子元素会自动继承默认命名空间,无需额外前缀
  • 修改通用元素模板,添加namespace="http://www.p.in.br/nf"属性,确保所有子元素都归属这个默认命名空间
  • 属性处理模板保持不变,直接保留原属性的名称和值

验证结果

用这个修改后的XSLT处理你的input.xml,会得到你期望的输出:

<?xml version="1.0" encoding="UTF-8"?>
<n0:nfeProc xmlns="http://www.p.in.br/nf" xmlns:n0="http://www.p.in.br/nf" versao="4.00">
  <cUF>35</cUF>
  <cNF>10131445</cNF>
</n0:nfeProc>

内容的提问来源于stack exchange,提问作者Kaushik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:21:17