名称空间属性添加到XML输出中



我正在使用XSLT变换产生XML输出。我添加了一个bizdata和Pyld节点,以包围标题和有效载荷数据。我得到了一个不必要的名称空间属性,该属性出现在bizdata和pyld上,我不确定它来自哪里。

我已经从文档标签中删除了所有数据,因为这一切都按预期填充。

XSLT如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common">
    <xsl:strip-space elements="*" />
    <xsl:output indent="yes" />
    <xsl:template match="/Root/node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="/">
        <xsl:variable name="vrtfPass1Result">
            <xsl:apply-templates/>
    </xsl:variable>
    <xsl:apply-templates mode="mPass2"
        select="ext:node-set($vrtfPass1Result)/*"/>
    </xsl:template>
    <xsl:template match="/Root">
    <BizData>
        <Hdr>
            <AppHdr>
                <CharSet>String</CharSet>
                <Fr>
                    <OrgId>
                        <Id>
                            <OrgId>
                                <Othr>
                                    <Id>4ABC</Id>
                                </Othr>
                            </OrgId>
                        </Id>
                    </OrgId>
                </Fr>
                <To>
                    <OrgId>
                        <Id>
                            <OrgId>
                                <Othr>
                                    <Id>DRRL</Id>
                                </Othr>
                            </OrgId>
                        </Id>
                    </OrgId>
                </To>
                <BizMsgIdr>EUSF</BizMsgIdr>
                <MsgDefIdr>a</MsgDefIdr>
                <CreDt>2001-12-17T09:30:47Z</CreDt>
            </AppHdr>
        </Hdr>
    </BizData>
    <Pyld>
    <Document>
        .....       
    </Document>
    </Pyld>
    </xsl:template> 
    <xsl:template match="@*|node()" mode="mPass2">
        <xsl:if test="normalize-space(.) != '' or ./@* != ''">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:apply-templates select="node()|@*" mode="mPass2"/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>
    <xsl:template match=
        "*[not(@*|*|comment()|processing-instruction()) 
         and normalize-space()=''
          ]" mode="mPass2"/>
</xsl:stylesheet>

我得到了:

<?xml version="1.0" encoding="utf-8"?>
<BizData xmlns:ext="http://exslt.org/common">   <<<WHY IS THERE THE ATTRIBUTE ADDED HERE
  <Hdr>
    <AppHdr>
      <CharSet>String</CharSet>
      <Fr>
        <OrgId>
          <Id>
            <OrgId>
              <Othr>
                <Id>4ABC</Id>
              </Othr>
            </OrgId>
          </Id>
        </OrgId>
      </Fr>
      <To>
        <OrgId>
          <Id>
            <OrgId>
              <Othr>
                <Id>DRRL</Id>
              </Othr>
            </OrgId>
          </Id>
        </OrgId>
      </To>
      <BizMsgIdr>EUSF</BizMsgIdr>
      <MsgDefIdr>a</MsgDefIdr>
      <CreDt>2001-12-17T09:30:47Z</CreDt>
    </AppHdr>
  </Hdr>
</BizData>
<Pyld xmlns:ext="http://exslt.org/common">    <<<WHY IS THERE THE ATTRIBUTE ADDED HERE
  <Document>
    .....
  </Document>
</Pyld>

不确定为什么属性-xmlns:ext =" http://exslt.org/common" - 在这些元素上填充...

预先感谢Saul

将属性 exclude-result-prefixes="ext"添加到XSLT的根元素中,以避免这种情况。

正如您在XSLT代码中声明的xmlns:ext="http://exslt.org/common"一样,名称空间声明范围范围为您的任何结果元素(例如BizData元素及其后代(,因此这就是为什么XSLT处理器为您的结果文档输出它(https:/https://www.w3.org/tr/xslt-10/#literal-result-element(。您只需要从输入中选择节点或选择扩展功能的任何名称空间,可以在exclude-result-prefixes中声明以避免在结果树序列化期间使用它。

最新更新