Различать XML на основе пространства имен в Apache Camel

Я использую Spring Boot и Apache Camel в своем проекте. Архитектура заключается в том, что некоторый XML поступает из входной очереди на уровень Camel, где он преобразуется в другой XML с помощью XSLT, а затем окончательный XML отправляется в выходную очередь. Приходящий XML имеет следующую форму.

<tns:Standalone xmlns:tns = "namespace1">
    <tns:name>Test</tns:name>
</tns:Standalone>

и это правильно преобразуется с помощью XSLT. Проблема в моем потоке, tns входящего XML может различаться (скажем, другой XML может поставляться с tns как namespace2). Тогда XSLT терпит неудачу. Поэтому мне нужна логика для дифференциации входящих XML-файлов на основе значений tns, чтобы я мог использовать разные XSLT для обоих сканариев. Не могли бы вы подсказать мне, как я могу различать входные XML-файлы на основе tns?

Если вы хотите, вы можете написать один XSLT, который будет по-разному обрабатывать узлы в разных пространствах имен.

michael.hor257k 16.12.2020 18:27

Не могли бы вы дать мне представление о том, как это сделать?

Anirban 17.12.2020 05:39

Нет, если вы не расширите то, что вы хотите сделать в каждом случае.

michael.hor257k 17.12.2020 08:27

Я хочу преобразовать сообщение в целевое сообщение и хочу сделать одно и то же преобразование в обоих случаях. В обоих случаях будет отличаться только tns входящего сообщения и ничего больше.

Anirban 17.12.2020 09:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот простой пример, показывающий, как можно использовать один XSLT для одинаковой обработки узлов в двух разных пространствах имен:

XSLT 1.0

<xsl:stylesheet version = "1.0" 
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:ns1 = "namespace1"
xmlns:ns2 = "namespace2"
exclude-result-prefixes = "ns1 ns2">
<xsl:output method = "xml" version = "1.0" encoding = "UTF-8" indent = "yes"/>

<xsl:template match = "/ns1:Standalone | /ns2:Standalone">
    <output>
        <xsl:value-of select = "ns1:name | ns2:name"/>
    </output>
</xsl:template>

</xsl:stylesheet>

Когда эта таблица стилей применяется к одному из следующих входных данных:

XML 1

<tns:Standalone xmlns:tns = "namespace1">
    <tns:name>Test</tns:name>
</tns:Standalone>

XML 2

<tns:Standalone xmlns:tns = "namespace2">
    <tns:name>Test</tns:name>
</tns:Standalone>

результат будет:

Результат

<?xml version = "1.0" encoding = "UTF-8"?>
<output>Test</output>

Спасибо, это было то, что я искал. Я не знал об условии ИЛИ при проверке в XSLT.

Anirban 17.12.2020 14:53

На самом деле | — это оператор объединения, а не ИЛИ.

michael.hor257k 17.12.2020 15:53

Другие вопросы по теме