как решить проблему версии пространства имен при использовании псевдонима пространства имен xsl - PullRequest
3 голосов
/ 05 октября 2011

У меня есть файл xslt, похожий на:

   <?xml version="1.0" encoding="utf-8"?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:MM="http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09"
      xmlns:RE="http://schemas.microsoft.com/sqlserver/RelationalEngine/Serialization/2011/09"
      xmlns:dac="urn:dacFunctions"
      exclude-result-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>

Проблема в том, что мы можем изменить пространство имен с http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09 to <a href="http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/10" rel="nofollow">http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/10</a>

для нового xmls, тогда старый xslt не может обработатьновые XML-файлы без изменения заголовка.Интересно, сможем ли мы иметь умный способ, позволяющий одному xlst обрабатывать все версии пространства имен.

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Проблема в том, что мы можем изменить пространство имен с http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09 на http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/10

для новых xmls, тогда старый xslt не сможет обрабатывать новые файлы xml без изменения заголовка.Интересно, сможем ли мы иметь умный способ, позволяющий одному xlst обрабатывать все версии пространства имен.

Нет общего способа, но если есть определенные ограничения, то что-то возможно.

При условии, что :

  1. Все имена, принадлежащие пространству имен "http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09", имеют префикс "mm:"

  2. Префикс "mm:" используется только в связи с тем же пространством имен.

Вы можете получить независимость пространства имен от uri следующим образом :

В любом выражении Xpath ссылаются на имя (скажем, someName) как:

*[starts-with(name(), 'mm:')]

и в редком случае, когда вы можете иметь имена атрибутов в этом пространстве имен (не рекомендуется дляатрибуты):

@*[starts-with(name(), 'mm:')]
0 голосов
/ 05 октября 2011

Мой предпочтительный подход к этому состоит в предварительной обработке документов (обычно с помощью другого преобразования XSLT), чтобы они использовали согласованное пространство имен.Таблица стилей предварительной обработки чрезвычайно проста, и, делая это таким образом, вы избегаете загромождения основной таблицы стилей большим количеством сложного условного кода.Кроме того, код предварительной обработки становится полностью повторно используемым;Вы можете использовать его в любом конвейере.

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

(я также советую людям не упаковывать информацию о версии в URI пространства имен, но Microsoft не сообщает ...)

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