2013-05-13 3 views
2

Итак, я пытаюсь преобразовать (Извлечь) все элементы в теле документа 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> 

ответ

2

Вы получаете предупреждение о «Нерешенные пространства имен префиксов мыло», потому что вы не объявили о soap имен в вашем XSLT .

Кроме того, ваш getDealerCodeById элемент связан с http://somedomainname/ пространства имен URI Вы не заметили, потому что он не использует пространство имен префикс:. xmlns="http://somedomainname/"

обязательно должна быть как soap пространства имен и http://somedomainname/ пространства имен в вашем XSLT и настроить XPath, чтобы использовать любое пространство имен префикс вы объявляете:

<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:template> 
+0

Спасибо за помощь Мэдс, но он, похоже, не работает. Я объявил пространство имен как советовало (в основном скопировал ваш код сверху) - любые другие мысли? – Boyds

+0

Это должно сработать. Протестировано с вами пример doc (после создания элемента документа, чтобы сделать его корректным XML). У вас может быть смешанное пространство типов или, возможно, другие пространства. Можете ли вы опубликовать более полный пример вашего входного XML и вашего XSLT? –

+0

Просто перечитайте и не заметите, что ваша заметка о пространстве имен мыла также не объявлена. Я обновил свой ответ. Вам нужно, чтобы все пространства имен были объявлены в вашем XSLT, чтобы иметь возможность использовать их в вашем XPath. –

0

Изменение кода в вашем вопросе означает, что мы не можем увидеть, что вопрос Мадс отвечал, что делает очень сложно следить за нитью. Но ситуация с вашим кодом, как сейчас, заключается в том, что вы привязываете префикс мыла к различным пространствам имен в исходном документе и таблице стилей, что не является незаконным, но, безусловно, запутывает и вряд ли будет тем, что вы намеревались. Пространство имен для somedomain.com также не соответствует.

Я ожидаю, что эффект этих ошибок будет таков, что ваша таблица стилей ничего не выводит. Я не знаю, что вы имеете в виду, говоря «он разбирает весь документ» - таблицы стилей всегда анализируют весь входной документ. Вы имеете в виду, что выводит весь входной документ? Это, конечно, не похоже на ваш код.

+0

Ты совершенно прав Майкл. Он ничего не выводит и выводит «весь входной документ». Любая мудрость? – Boyds

+0

Что это значит? Как он может выводить ничего и выводить весь входной документ одновременно? –

+0

Приношу свои извинения Майклу. Я хотел сказать, что у меня нет вывода в моем браузере. – Boyds

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