2016-03-07 3 views
0

Я пытаюсь написать xslt для изменения xml. Это ответ, полученный синхронным вызовом. Эта структура xml должна быть изменена, и данные должны быть переданы, чтобы отклик мог быть использован исходной системой.Невозможно извлечь элементы с использованием Xslt

Входной XML, как показано ниже:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"> 
    <SOAP-ENV:Body> 
     <ns0:ValidateMeterItemResponse xmlns:ns0="http://www.apsc.com/CCB/ValidateMeterItem/InOut"> 
     <ns1:ValidateMeterItemRes xmlns:ns1="http://www.apsc.com/CCB/MeterServices/InOut"> 
      <ns1:verificationStatus>M2IV</ns1:verificationStatus> 
      <ns1:errorCode>256.0</ns1:errorCode> 
      <ns1:errorText>Service Point ID 1245765566 field invalid</ns1:errorText> 
      <ns1:readingDetails/> 
     </ns1:ValidateMeterItemRes> 
     </ns0:ValidateMeterItemResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Ожидаемый результат XML является:

<responseMessage/"> 
    <response> 
     <errorCode>256.0</errorCode> 
    </response> 
</responseMessage> 

Я пытаюсь просто извлечь только один узел на данный момент.

Ниже приведен XSLT, который я написал. Сначала я скопировал все элементы as-is, а затем попытался покончить с узлом <ValidateMeterItemResponse>. Затем я пытаюсь создать свой xml (с другой структурой), выбирая определенные элементы из входного xml с помощью xsl value of.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://xmlns.oracle.com/OUMWM/Message" 
xmlns:ns1="http://xmlns.oracle.com/OUMWM/Message1"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*/*/*"> 
     <xsl:apply-templates select="node()" /> 
    </xsl:template> 
     <xsl:strip-space elements="*"/> 
    <xsl:template match="/*"> 
     <responseMessage> 
      <response> 
       <errorCode> 
        <xsl:value-of select="SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:ValidateMeterItemRes/ns1:errorCode" /> 
       </errorCode> 
      </response> 
     </responseMessage> 
    </xsl:template> 
</xsl:stylesheet> 

Я не могу извлечь элемент даже после того, как все пути правильные. Я уверен, что пропустил что-то, пытаясь добиться этого. Где я неправ?

ответ

1

Первая проблема заключается в том, что ваши URI пространства имен отличаются между XML и XSLT. В XML вы это определено ..

xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"  
xmlns:ns0="http://www.apsc.com/CCB/ValidateMeterItem/InOut" 
xmlns:ns1="http://www.apsc.com/CCB/MeterServices/InOut" 

Но в XSLT у вас есть эти ...

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns0="http://xmlns.oracle.com/OUMWM/Message" 
xmlns:ns1="http://xmlns.oracle.com/OUMWM/Message1" 

Это является пространством имен URI, которые должны совпадать, а не префикс.

Другая проблема заключается в том, что в вашем выражении xpath в конечном шаблоне вы пропустили ns0:ValidateMeterItemResponse. Выражение xpath также начинается с SOAP-ENV:Envelope, что не требуется, потому что ваш шаблон уже соответствует корневому элементу, поэтому выражение xpath относится к этому.

Попробуйте этот XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" 
xmlns:ns0="http://www.apsc.com/CCB/ValidateMeterItem/InOut" 
xmlns:ns1="http://www.apsc.com/CCB/MeterServices/InOut"> 

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 

    <xsl:template match="/*"> 
     <responseMessage> 
      <response> 
       <errorCode> 
        <xsl:value-of select="SOAP-ENV:Body/ns0:ValidateMeterItemResponse/ns1:ValidateMeterItemRes/ns1:errorCode" /> 
       </errorCode> 
      </response> 
     </responseMessage> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Привет Тим, Большое спасибо. !! Ценю вашу помощь!! это сработало! –

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