Xslt производит Xslt: установка корневых пространств имен - PullRequest
2 голосов
/ 20 января 2012

Я использую XSLT в качестве «генератора кода» для различных компонентов, включая другие XSLT.Например, у меня есть запрос, который производит вывод XML строк MSSQL sys.columns для таблицы, и я хочу создать XSLT, который включает в себя таблицу со столбцом для каждой строки.

Поэтому я хочу произвестиследующий XSLT:

<xsl:stylesheet version="1.0" xmlns:format="urn:qbo3-formatting" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  ...
</xsl:stylesheet>

Я генерирую XSLT выше с помощью чего-то вроде этого «генератора» XSLT:

<xsl:element name="xsl:stylesheet">
  <xsl:attribute name="version">1.0</xsl:attribute>
  <xsl:attribute name="format" namespace="http://www.w3.org/XML/1998/namespace" >urn:qbo3-formatting</xsl:attribute>
  ...
</xsl:element>

Проблема в том, что этот XSLT «генератора» производит:

<xsl:stylesheet version="1.0" xml:format="urn:qbo3-formatting" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  ...
</xsl:stylesheet>

Обратите внимание на xml:format вместо требуемого xmlns:format.

В соответствии с W3C, xmlns зарезервировано и связано с http://www.w3.org/2000/xmlns/'. Если я пытаюсь создать атрибут формата вышеиспользуя это пространство имен, я получаю сообщение об ошибке:

Elements and attributes cannot belong to the reserved namespace 'http://www.w3.org/2000/xmlns/'.

Есть предложения по обходу?

Заранее спасибо,

Эрик

Ответы [ 2 ]

1 голос
/ 20 января 2012

Это как раз основной сценарий использования инструкции <xsl:namespace-alias> :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:format="some:format"
 xmlns:xxx="xxx">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:namespace-alias stylesheet-prefix="xxx"
                      result-prefix="xsl"/>

 <xsl:template match="/">
    <xxx:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:format="some:format"
     >

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

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

Когда это преобразование применяется к любому документу XML (не используется)желаемый результат (новая таблица стилей со всеми требуемыми атрибутами и пространствами имен):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:format="some:format">
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Примечание : избегайте использования xsl:element и предпочитайте xsl:namespace-alias всякий раз, когда преобразованиесоздать другую таблицу стилей XSLT.

0 голосов
/ 20 января 2012

Попробуйте вместо этого:

<xsl:element name="xsl:stylesheet">
  <xsl:attribute name="version">1.0</xsl:attribute>
  <xsl:namespace name="format" select="'urn:qbo3-formatting'"/>
</xsl:element>

Альтернативно, вместо явного вывода пространства имен XML, позвольте XSLT автоматически генерировать пространства имен XML, как только узлы этого пространства имен будут использованы. Если ни один элемент не использует urn:qbo3-formatting, тогда объявление пространства имен не требуется.

...