2013-04-03 4 views
0

Я использую программное обеспечение, которое импортирует XML-файл в рабочий процесс, а затем экспортирует его в веб-службу с помощью задач рабочего процесса. файл XML, как:Вставить XSLT в запрос SOAP

<?xml version="1.0"?> 
    <NostroEvent> 
     <Id>1</Id> 
     <AccountNumber>123</AccountNumber> 
     <Debit>100</Debit> 
    </NostroEvent> 

Файл импортируется и я пишу следующий запрос SOAP задачи ExportWS, что бы выбрать все теги XML, и отправляет их на веб-службы: (конфигурация подключения к веб-службе также вводится в решении этой задачи в другом разделе)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <!--xsl:variable name="nostro"> 
    <xsl:copy-of select="NostroEvent"></xsl:copy-of> 
    </xsl:variable--> 
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmt="http://bmt"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <bmt:insertNostro> 
     <bmt:Xml><xsl:copy-of select="NostroEvent"/></bmt:Xml> 
     </bmt:insertNostro> 
    </soapenv:Body> 
    </soapenv:Envelope> 
    </xsl:template> 
    </xsl:stylesheet> 

Обратите внимание, что insertNostro является веб-метод и Xml является параметр, к которому я передаю набор тегов и текста начиная с NostroEvent. Но это не работает. Я продолжаю получать исключение нулевого указателя, что означает, что веб-служба получила пустую строку. Я попытался использовать переменную xsl наверху, но она также была бесполезной.

+0

Я побежал это успешно, как с помощью Saxon и Xalan. Кажется, что нет ничего плохого в вашем XSLT. – lassejl

+0

Я думаю, что проблема заключается в том, что мой веб-сервис ожидает строку Xml, и я передаю поддерево с xsl: copy-by вместо строки. Вот почему это дает мне исключение null-указателя. Но я не знаю, как преобразовать возвращаемое значение xsl: copy-in в строку – DalalH

ответ

1

Если проблема заключается в том, что это XML и не строка, попробуйте сделать что-то вроде этого:

<xsl:template match="/"> 
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmt="http://bmt"> 
     <soapenv:Header/> 
     <soapenv:Body> 
      <bmt:insertNostro> 
       <bmt:Xml> 
        <xsl:apply-templates select="NostroEvent" mode="toString"/> 
       </bmt:Xml> 
      </bmt:insertNostro> 
     </soapenv:Body> 
    </soapenv:Envelope> 
</xsl:template> 

<xsl:template match="*" mode="toString"> 
    &lt;<xsl:value-of select="local-name()"/>&gt;<xsl:apply-templates select="child::node()" mode="toString"></xsl:apply-templates>&lt;<xsl:value-of select="local-name()"/> /&gt; 
</xsl:template> 
+0

В зависимости от того, какой процессор XSLT используется, для этого может быть вспомогательная функция, такая как saxon: serialize(). – samjudson

+0

Есть ли способ показать «<" and ">», поскольку они вместо < и >? – DalalH

+0

Да, но это сделает вывод таким же, каким он был. – lassejl

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