Как я могу предотвратить эти избыточные пространства имен из таблицы стилей XSLT? - PullRequest
5 голосов
/ 06 мая 2009

При использовании таблицы стилей XSLT для преобразования файла XML, который содержит встроенный XHTML (с использованием пространств имен), в чистый XHTML, у меня остаются избыточные определения пространства имен для элементов, которые изначально были XHTML. Простой тестовый пример:

XML:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xml" href="fbb.xsl"?>
<foo xmlns="urn:foo:bar:baz" xmlns:html="http://www.w3.org/1999/xhtml">
    <bar>
        <baz>Some <html:i>example</html:i> text.</baz>
    </bar>
</foo>

XSL:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:fbb="urn:foo:bar:baz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="fbb">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/fbb:foo">
        <html>
            <head>
                <title>Example</title>
            </head>

            <body>
                <p>
                    <xsl:copy-of select="fbb:bar/fbb:baz/node()"/>
                </p>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Выход:

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Example</title>
  </head>
  <body>
    <p>Some <html:i xmlns="urn:foo:bar:baz" xmlns:html="http://www.w3.org/1999/xhtml">example</html:i> text.</p>
  </body>
</html>

Можно ли предотвратить добавление избыточных пространств имен (и префикса) к элементу <i>? (Для справки я использую xsltproc с libxml2-2.7.3 и libxslt-1.1.24 на Cygwin.)

Ответы [ 2 ]

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

Вместо xsl:copy-of используйте шаблоны преобразования идентификаторов и удалите префикс пространства имен из элементов XHTML.

<xsl:stylesheet version="1.0"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:fbb="urn:foo:bar:baz"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:html="http://www.w3.org/1999/xhtml"
                exclude-result-prefixes="fbb html">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/fbb:foo">
    <html>
      <head>
        <title>Example</title>
      </head>
      <body>
        <p>
          <xsl:apply-templates select="fbb:bar/fbb:baz/node()"/>
        </p>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="html:*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

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

</xsl:stylesheet>
4 голосов
/ 06 мая 2009

Обновите exclude-result-prefixes, добавив пространство имен по умолчанию:

exclude-result-prefixes="#default"

Или вы можете подавить все встроенные пространства имен, выполнив:

exclude-result-prefixes="#all"

Однако есть некоторая неожиданность, поскольку некоторые процессоры ожидают разделенный пробелами список, а другие ожидают разделенный запятыми список. xsltproc, похоже, любит разделять запятыми, поэтому, если вы все еще хотите быть явным, вы можете сделать:

exclude-result-prefixes="#default,fbb"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...