Итак, я пытаюсь преобразовать (Извлечь) все элементы в теле документа SOAP в XML с помощью XSLT. Вот мой SOAP документ (полное)Из SOAP в XML с использованием XSLT
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="dealercode.xsl"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthHeader xmlns="http://www.somedomain.com/">
<LogonID></LogonID>
<Password></Password>
</AuthHeader>
</soap:Header>
<soap:Body>
<getDealerCodeById xmlns="http://www.somedomain.com/">
<BrokerCode>{ssQuoterBrokerCode(app_id)}</BrokerCode>
<IDNumber>{dealerCode}</IDNumber>
</getDealerCodeById>
</soap:Body>
</soap:Envelope>
И вот мой XSLT-лист.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<?xml-stylesheet type="text/xsl" href="dealercode2soap.xsl"?>
<xsl:template match="/*">
<xsl:value-of select="soap:Body/s:getDealerCodeById"
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
xmlns:s="http://somedomainname/" />
</xsl:stylesheet>
Но выход не то, что я хочу. Он по-прежнему анализирует весь документ SOAP, а не просто дает мне содержимое в элементах «мыло: тело», и я также получаю предупреждение о «неразрешенном мыло для префикса имен»
Где я иду не так?
EDIT: Мне удалось заставить его работать с использованием другого блока кода. Ниже
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns ="http://www.somedomainename.com">
<xsl:template match="/">
<xsl:apply-templates select="soap:Envelope/soap:Body/*"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Теперь она выводит в браузере содержимое секции тела. Другая важная вещь, которую я понял, это то, что форматирование выполнялось на стороне сервера, но поскольку у меня не было доступа к серверу в то время, когда я понятия не имел, работает ли мой код или нет. Это желаемый результат я искал (который, по-видимому работает все время.
<?xml version="1.0" encoding="UTF-8"?>
<getDealerCodeById xmlns="http:///" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<BrokerCode>{ssQuoterBrokerCode(app_id)}</BrokerCode>
<IDNumber>{dealerCode}</IDNumber>
</getDealerCodeById>
Спасибо за помощь Мэдс, но он, похоже, не работает. Я объявил пространство имен как советовало (в основном скопировал ваш код сверху) - любые другие мысли? – Boyds
Это должно сработать. Протестировано с вами пример doc (после создания элемента документа, чтобы сделать его корректным XML). У вас может быть смешанное пространство типов или, возможно, другие пространства. Можете ли вы опубликовать более полный пример вашего входного XML и вашего XSLT? –
Просто перечитайте и не заметите, что ваша заметка о пространстве имен мыла также не объявлена. Я обновил свой ответ. Вам нужно, чтобы все пространства имен были объявлены в вашем XSLT, чтобы иметь возможность использовать их в вашем XPath. –