Атрибуты пространства имен добавлены в вывод XML - PullRequest
1 голос
/ 04 июля 2019

Я создаю вывод XML с использованием XSLT-преобразования.Я добавил узлы 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 Ответ

4 голосов
/ 04 июля 2019

Добавьте атрибут exclude-result-prefixes="ext" к корневому элементу XSLT, чтобы избежать этого.

Поскольку вы объявили xmlns:ext="http://exslt.org/common" в своем коде XSLT, объявление пространства имен находится в области действия любого из ваших элементов результата (например, элемента BizData и его потомков), поэтому процессор XSLT выводит его дляваш результирующий документ (https://www.w3.org/TR/xslt-10/#literal-result-element). Любое пространство имен, которое вам нужно только для выбора узлов из входных данных или для выбора функций расширения, может быть объявлено в exclude-result-prefixes, чтобы избежать его использования во время сериализации дерева результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...