использование единого объявления пространства имен для литерального элемента результата и методов конструктора элемента - PullRequest
0 голосов
/ 08 июня 2018

С учетом источника XML

<Content>
</Content>

и преобразования:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
  office:version="1.0"
  xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
  xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">

  <xsl:output indent="yes" encoding="UTF-8"/>
  <xsl:template match="Content">
    <xsl:element name="office:document">
      <xsl:attribute name="office:version">1.2</xsl:attribute>
      <xsl:attribute name="office:mimetype">application/vnd.oasis.opendocument.text</xsl:attribute>

      <xsl:element name="office:body">
        <xsl:element name="office:text">
          <xsl:element name="text:p">Hello world.
          </xsl:element>
          <xsl:element name="text:p">Goodbye world.
          </xsl:element>
        </xsl:element>
      </xsl:element>

    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Результат

<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
                 office:version="1.2"
                 office:mimetype="application/vnd.oasis.opendocument.text">
   <office:body>
      <office:text>
         <text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">Hello world.
          </text:p>
         <text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">Goodbye world.
          </text:p>
      </office:text>
   </office:body>
</office:document>

Пространство имен для элементов абзаца повторяется.Я хочу, чтобы он применялся к корневому элементу, чтобы избежать этого, как это принято в odf-файлах.

Но если я добавлю пространства имен к корневому элементу, XSL будет включать избыточные объявления пространства имен для электронной таблицы и корневого элемента.элементы.Если я затем удалю пространства имен из элемента таблицы стилей, я не смогу добавить буквальные результирующие элементы в эти пространства имен.

Я прочитал в 4-й публикации Кея справочную информацию p473 «Избегание дублирования объявлений пространства имен - это полностью работасериализатор XSLT .. "Но я не могу использовать эту информацию для получения требуемого результата.

1 Ответ

0 голосов
/ 08 июня 2018

Для включенного примера вы получите включенный результат, так как элементы, сгенерированные с помощью xsl:element, не имеют пространств имен, которые вы объявляете в элементе таблицы стилей, они используются только для создания элемента в определенном пространстве имен.Из этого примера не ясно, зачем вообще нужен xsl:element, и вы не можете просто использовать буквальные элементы результата.

Если вам действительно нужно создать корневой элемент с помощью xsl:element, вы можете создать узел пространства имен с помощью <xsl:namespace name="text" select="'urn:oasis:names:tc:opendocument:xmlns:text:1.0'"/>.См. https://xsltfiddle.liberty -development.net / jyH9rMg для онлайн-примера, который преобразует входную выборку с

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
  office:version="1.0"
  xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
  xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">

  <xsl:output indent="yes" encoding="UTF-8"/>
  <xsl:template match="Content">
    <xsl:element name="office:document">
      <xsl:namespace name="text" select="'urn:oasis:names:tc:opendocument:xmlns:text:1.0'"/>
      <xsl:attribute name="office:version">1.2</xsl:attribute>
      <xsl:attribute name="office:mimetype">application/vnd.oasis.opendocument.text</xsl:attribute>

      <xsl:element name="office:body">
        <xsl:element name="office:text">
          <xsl:element name="text:p">Hello world.
          </xsl:element>
          <xsl:element name="text:p">Goodbye world.
          </xsl:element>
        </xsl:element>
      </xsl:element>

    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

в

<office:document xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
                 xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
                 office:version="1.2"
                 office:mimetype="application/vnd.oasis.opendocument.text">
   <office:body>
      <office:text>
         <text:p>Hello world.
          </text:p>
         <text:p>Goodbye world.
          </text:p>
      </office:text>
   </office:body>
</office:document>
...