2016-01-21 4 views
0

У меня есть входящие XML-файлы из разных систем с пространствами имен, объявленными для текущей версии сообщения.
Пример: xmlns: abc = "MatchingVersion_6-0"
Я разбираю это без проблем, используя небольшой лист XSLT.XSLT для обработки префиксов пространства имен с разными URL-адресами

Одна из систем питания теперь обновил версию и кормятся с новой версией namepsace:
Примера: Xmlns: а = «MatchingVersion_7-0»

Есть ли способ, что я могу справиться с обеими типов с той же таблицей стилей, поскольку я все еще получаю обе версии файла XML к тому же интерфейсу, который использует эту таблицу стилей. Xpaths все одинаковы, префикс один и тот же, но префикс разрешает разные значения, вызывающие эту проблему. Я изучил это, и это кажется возможным, используя [local-name] - хотя мне было интересно, есть ли лучший способ достичь этого? Спасибо заранее!

+1

Если вы можете положиться на префикс элемента + локальное имя для идентификации целевого элемента, то использование 'name()' может быть немного лучше, чем 'local-name()': '* [name() = 'abc : foo '] ' – har07

ответ

0

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

Ничто в XML-toolchain, включая XSLT, не дает вам возможности сопоставлять элементы в одном пространстве имен с другими. Существуют неэффективные решения, такие как подстановочные знаки для пространств имен и local-name(), но они обошли все вещи, которые XSLT пытается сделать, чтобы сделать работу бесперебойно, и сделать ваш код уродливым.

Лучшее предложение, которое у меня есть, - это автоматическое создание нового XSLT для новой версии пространства имен. Вы можете использовать XSLT для работы с XSLT для этого.

Конечно, могут быть более простые решения, если проблема ограничена по охвату; Вы можете использовать дизъюнкции как это:

<xslt:template match="a1:foo|a2:foo"> ... </xslt:template> 

полагая a1 и a2 связаны с двумя различными пространствами имен.

+0

Спасибо! Я не эксперт XSLT, и использую его нечасто - поэтому моя причина спрашивать, как вы указали, состояла в том, что найденные мной решения, казалось, обходили части, которые есть по уважительной причине. Я только что нашел какой-то другой унаследованный код, который изобилует «local-name()» на всем протяжении - вот как это было в прошлом (и его уродливым, как вы предсказывали). Я буду изучать дизъюнкции, но вы ответили на мой запрос (Theres no good way), и я, вероятно, буду использовать 2 таблицы стилей и направлять файлы на правильный, в зависимости от интерфейса. Еще раз спасибо! .. – devranred

0

XSLT/XPath 2.0 и более поздние версии позволяют использовать, например, <xsl:template match="*:foo"> соответственно шаги пути с дикой картой для префикса пространства имен, чтобы вы могли написать свой XSLT, чтобы обслуживать любое пространство имен, используя только локальные имена для соответствующего выбора.

В XSLT 3.0 вы можете использовать атрибуты тени для параметризации xpath-default-namespace, см. section in the spec on that.

+0

Спасибо за ответ. К сожалению, я застрял с XSLT 1.0 в данный момент, но это стоит знать. – devranred

Смежные вопросы