Пространство имен корневого тега XSLT вместо пространства имен атрибута элемента - PullRequest
7 голосов
/ 20 мая 2009

У меня есть XSL-файл для передачи другого XSL-файла. Я хочу, чтобы объявление пространства имен находилось в корневом теге, а не повторялось для каждого отдельного элемента !!

Вот моя таблица стилей:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mynamespace="somenamespace" version="2.0">
    <xsl:output method="xml" omit-xml-declaration="no" standalone="yes" indent="yes" />
    <xsl:template match="myMatchedNode">
        <mynamespace:tag>Some text i want inserted into the xsl</mynamespace:tag>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" /></xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Выводит что-то вроде этого:

....

<mynamespace:tag xmlns:mynamespace="somenamespace">Some text i want inserted into the xsl</mynamespace:tag>

....

Как заставить декларацию пространства имен на корневой тег результата?!

Ответы [ 2 ]

8 голосов
/ 20 мая 2009

Вам необходимо вставить узел пространства имен в элемент документа вашего дерева результатов. Есть несколько способов сделать это, в зависимости от того, используете ли вы XSLT 1.0 или 2.0. Ниже приведено решение 2.0. Я предполагаю, что вы делаете модифицированное преобразование идентичности во входном документе (ваш вопрос на самом деле не был указан):

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- special rule for the document element -->
  <xsl:template match="/*">
    <xsl:copy>
      <!-- Add a namespace node -->
      <xsl:namespace name="mynamespace" select="'somenamespace'"/>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- the identity template -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- the rest of your rules -->

</xsl:stylesheet>

Для полного охвата всех различных методов управления пространствами имен в выходном документе см. Раздел «Недостаточно пространств имен» статьи «Пространства имен в XSLT» на моем веб-сайте.

1 голос
/ 20 мая 2009

Возможно, я неправильно понял вопрос, но я думаю, что вы должны сделать это:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="somenamespace"
    version="2.0">

<xsl:output method="xml" omit-xml-declaration="no" standalone="yes"  indent="yes"/>

<xsl:template match="myMatchedNode">
  <tag>Some text i want inserted into the xsl</mynamespace>

  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Это должно позволить вам использовать теги пространства имен в качестве пространства имен по умолчанию, а в выходном документе они будут также использоваться в качестве пространства имен по умолчанию. Ваш входной документ все еще может использовать неприятный синтаксис mynamespace: tag.

Вы также можете попробовать сделать это:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="somenamespace"
    xmlns:mynamespace="somenamespace"
    version="2.0">

Я не совсем уверен, что заменит тег mynamespace: просто тегом, и если это произойдет, это может зависеть от реализации.

...