Изменение xslt, чтобы оно не зависело от пространства имен - PullRequest
7 голосов
/ 03 февраля 2009

У меня есть XSLT, который я создал для обработки определенного XML-документа. Однако теперь пространства имен вводятся в некоторых, но не во всех наших документах. Я хотел бы использовать тот же XSLT для этих документов, однако у меня возникли проблемы с изменением моей таблицы стилей, чтобы она не зависела от пространства имен.

Ранее предлагалось изменить мои xpath-ы до *[local-name()="ElementName"], однако, учитывая, что мы уже создали таблицу стилей, это очень трудоемко.

Кроме того, я знаю, что могу установить xpath-default-namespace для определенного пространства имен, но, как упоминалось ранее, я не могу просто установить его на #all или список возможных пространств имен. Я ищу более эффективное решение, и мне доступны функции расширения процессора Saxon. Есть идеи? Спасибо.

Ответы [ 4 ]

3 голосов
/ 04 февраля 2009

Рассматривали ли вы предварительную обработку ваших документов XML?

Вы можете удалить все пространства имен (знать о возможных конфликтах) и затем обработать его, используя существующее XSL-преобразование.

Преимущество такого подхода состоит в том, что вам вообще не нужно изменять свой XSLT. Он остается читабельным (* [local-name () = 'frob'] выглядит так ужасно) и удобным в обслуживании.

1 голос
/ 07 февраля 2009

Может быть, я не понимаю вашу проблему, но не могли бы вы, чтобы ваш шаблон (ы) совпадал с версией пространства имен NULL и версией элемента с пространством имен? - Вот так:

<xsl:template match="ElementName | NS:ElementName" xmlns:NS="your-namespace">
   ... output ...
</xsl:template>

(Обычно объявление префикса NS помещается в элемент таблицы стилей)

Это, на мой взгляд, самая «чистая» версия - я использовал ее, чтобы иметь единую таблицу стилей XSLT для обработки всех трех форматов RSS (0.91, 1.0 и 2.0).

1 голос
/ 03 февраля 2009

После дальнейших консультаций кажется, что просто нет легкого выхода из этого. XSLT должен быть изменен, чтобы быть независимым от пространства имен, или использовать атрибут xpath-default-namespace в элементе <xsl:stylesheet>. Если мы хотим сохранить пространство имен входящего документа, но при этом одна таблица стилей будет работать с несколькими пространствами имен, тогда наши шаблоны должны выглядеть следующим образом:

<xsl:template match="*[local-name(.)='ElementName']">
   <xsl:element name="{local-name(.)}" xmlns="http://yourURIhere">
      <xsl:value-of select="."/>
   </xsl:element>
</xsl:template/>

и т.д.

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

Я нашел следующую страницу, чтобы хорошо представить проблему, но не дал решения:

http://www.edankert.com/defaultnamespaces.html

И я нашел решение этой проблемы в O'Reilly «XML в двух словах»:

http://docstore.mik.ua/orelly/xml/xmlnut/ch08_10.htm

...