命名空间属性添加到XML输出

时间:2019-07-04 13:33:29

标签: xml xslt

我正在使用XSLT转换生成XML输出。 我添加了一个BizData和Pyld节点来包围标题和有效载荷数据。 我得到了一个不确定的名称空间属性,该属性出现在BizData和Pyld上,我不确定该属性来自何处。

我已经从Document标记中删除了所有数据,因为它很多,但是全部都按预期填充。

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” ...

预先感谢, 扫罗

1 个答案:

答案 0 :(得分:4)

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

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