XSLT: как писать избыточные xmlns? - PullRequest
0 голосов
/ 24 декабря 2010

Мне нужен следующий вывод для системы bizzare, которая ожидает тот же xmlns, объявленный в parent и child, и отказывается работать в противном случае.То есть это то, что ожидалось:

<root xmlns="http://something">
  <element xmlns="http://something" />
</root>

Я могу создать xmlns в корне с помощью

<?xml version="1.0" ?>

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

<xsl:template match="/">
  <xsl:element name="root" namespace="http://something">
      <xsl:element name="node" namespace="http://something" />
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

Однако он не добавляет xmlns в childnode, потому что родительский узел имеет тот же xmlns.Как заставить XSLT писать xmlns без учета родителя?

1 Ответ

0 голосов
/ 28 декабря 2010

Спецификация схемы XML прямо запрещает атрибуты с именем xmlns, поэтому таблица стилей XSLT не может создавать такие атрибуты напрямую, используя <xsl:attribute>. Я вижу только два варианта для вас ...

Один из вариантов - создать фиктивные атрибуты, используя другое имя (например, xmlnsx):

<xsl:template match="/">
  <xsl:element name="root">
      <xsl:attribute name="xmlnsx">http://something</xsl:attribute>
      <xsl:element name="node">
          <xsl:attribute name="xmlnsx">http://something</xsl:attribute>
      </xsl:element>
  </xsl:element>
</xsl:template>

... и затем замените все вхождения атрибута xmlnsx на xmlns на некотором этапе постобработки (например, SAX-фильтр или другой потоковый редактор). Однако это решение включает в себя вставку не-XSLT-шага в конвейер.

Другой вариант - чистый, но безобразный, XSLT. Вы можете сгенерировать необходимый XML напрямую, используя xsl:text и disable-output-escaping, например:

<xsl:template match="/">
  <xsl:text disable-output-escaping="yes">&lt;root xmlns="http://something"&gt;</xsl:text>
  <xsl:text disable-output-escaping="yes">&lt;node xmlns="http://something"&gt;</xsl:text>
  <xsl:text disable-output-escaping="yes">&lt;/root&gt;</xsl:text>
</xsl:template>

Обратите внимание, что спецификация XSLT 1.0 довольно рыхлая, когда дело доходит до сериализации, поэтому конкретный процессор XSLT все еще может исключить избыточные объявления пространства имен из этого второго решения. Тем не менее, он работал на четырех процессорах, которые я пробовал (а именно Saxon, MSXML, MSXML.NET и LIBXML).

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