咨询如何修改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
相关产品推荐
相关产品推荐

