Как я могу написать XSLT, который сохраняет ссылки на пространства имен в текстовых элементах? - PullRequest
0 голосов
/ 16 февраля 2011

Я пишу XSLT, который преобразует ошибки SOAP 1.2 в ошибки SOAP 1.1.Я использую XSLT v2.0, и я делаю преобразование в Java;возможно, с использованием Xerces или любого другого XML-преобразования, поставляемого в комплекте с Java.У ошибок Soap 1.2 есть части, которые выглядят так:

<soap12:code xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Value>soap12:Sender</soap12:Value>
  ...
</soap12:code>

Но ошибки Soap 1.1 выглядят так:

<soap11:Fault xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
  <faultcode>soap11:Server</faultcode>
  ...
</soap11:Fault>

Итак, сложная часть заключается в том, что мой XSLT должен генерировать что-то вроде"soap11: сервер".Он должен ссылаться на пространство имен soap11 с любым соответствующим префиксом, выбранным механизмом XSLT.Это может быть префикс типа «soap11», но также может быть префикс типа «soap» или «ns1», в зависимости от того, как выглядит исходный документ.Теперь для атрибутов и элементов механизм XSLT обрабатывает это для вас, генерируя атрибуты / элементы с правильными префиксами.Однако он не изменяет эти ссылки на пространства имен, когда они встречаются в необработанном тексте.Вот соответствующий фрагмент моего XSLT:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
    exclude-result-prefixes="soap12"
    version="2.0">

    <xsl:template match="soap12:Fault">
        <soap11:Fault>
            <!-- presumably some mapping logic will go here -->
            <faultcode>soap11:Server</faultcode>
            ...
        </soap11:Fault>
    </xsl:template>
    ...
</xsl:stylesheet>

Есть ли способ сообщить XSLT, что "soap11: Server" в этом контексте относится к пространству имен soap11?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Ваш код правильный .Вы можете проверить это, запустив преобразование и:

  1. Просмотр результата.

  2. Синтаксический анализ результата с анализатором XML, чтобы убедиться, что этоправильно сформированный документ XML.

1 голос
/ 16 февраля 2011

Давайте попробуем разобраться, используете ли вы XSLT 1.0 или XSLT 2.0. Вы говорите, что используете XSLT 2.0, но также говорите, что в JDK используется механизм XSLT по умолчанию, который поддерживает только XSLT 1.0.

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

Таким образом, ответ таков: если вы используете движок XSLT 1.0, как кажется, то языковая спецификация не дает никаких гарантий относительно префиксов пространства имен в выходных данных, хотя на практике большинство процессоров будут делать разумные вещи в простых случаях. Если вы хотите получить гарантию, вам нужно перейти на процессор XSLT 2.0.

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