Есть ли способ игнорировать пространства имен во время преобразования XSL? - PullRequest
7 голосов
/ 10 марта 2009

Проверка пространства имен отключена на сервере, который обрабатывает преобразования XSL (потому что тот, кто написал XSL, не понимал пространства имен). Мне нужно внести изменения в XSL, но я не могу проверить его, потому что не определены пространства имен, т. Е.

Вместо

 <xsl:template match="ns:element[position()=1]">...

имеет

 <xsl:template match="element[position()=1]">...

, поэтому он не соответствует ни одному из элементов XML, потому что все они квалифицированы как пространства имен.

Я не могу проверить на сервере, потому что у меня нет доступа к нему. Исправлять XSL бесполезно, потому что тогда должна быть включена проверка пространства имен, и это сломает все остальные преобразования.

Итак, мне нужно найти способ игнорировать пространства имен во время преобразования XSL. У меня есть доступ к MSXML, XMLSpy (здесь я не могу найти нужную опцию), и, если мне действительно нужно, я могу что-то написать в C # или аналогичном языке.

В качестве последнего средства я могу написать несколько регулярных выражений, но я действительно не хочу идти по этому пути, особенно когда речь идет о XML ...

В ответ на комментарий о более подробной информации:

Это виртуальный сервер Windows 2003, на котором запущен экземпляр сервлета Methode (www.eidosmedia.com). Я не знаю, какую технику использует этот сервлет для выполнения XSL-преобразований. Они игнорируют пространства имен, потому что человек, который изначально написал XSL, не понимал их и не включил их в XSL. Так что теперь все XSL-файлы (сотни) не имеют пространств имен.

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

Ответы [ 3 ]

5 голосов
/ 10 марта 2009

Вы могли бы выполнить преобразование, чтобы удалить все пространства имен из вашего ввода до вашего "реального" преобразования. Но ... я не уверен, если вы должны сделать это. Это ужасно.

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

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

  <xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="." />
    </xsl:attribute>
  </xsl:template>  

</xsl:stylesheet>

Оригинальный ответ:

Это будет вариант?

<xsl:template match="*[local-name()='element' and position()=1]">...

(как показали комментарии - не будет)

1 голос
/ 11 марта 2009

Я публикую это как ответ, потому что это слишком долго, чтобы уместиться в качестве комментария.

Ни один процессор XSLT, о котором я когда-либо слышал, не позволяет просто игнорировать пространства имен во входном XML. Если у вас есть XSL-преобразования, написанные в незнании пространств имен, и XML-документы, в которых они используются, вам придется использовать сломанный сервлет для выполнения преобразования или предварительно обработать XML-документы для удаления пространств имен.

Преобразование, опубликованное Томалаком, сделает это - и, в отличие от использования регулярных выражений, оно сделает это, не испортив все остальное в XML. И это тоже не очень большая работа. Цепные преобразования довольно просты.

0 голосов
/ 10 марта 2009

Сколько пространств имен в преобразуемом XML-файле?

Если 1, можете ли вы временно добавить это пространство имен в качестве пространства имен по умолчанию для вашего XSL? Хорошо, это означает, что вам может потребоваться изменить выходное пространство имен и т. Д., Но после тестирования вы можете удалить эти настройки.

Если их больше 1, это означает, что в пространствах имен нет локальных конфликтов имен. Не могли бы вы настроить тестовый входной XML, чтобы все псевдонимы указывали на одно и то же пространство имен, а затем выполнить приведенную выше настройку.

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