Как получить значение тега XML с помощью XSLT - PullRequest
0 голосов
/ 31 марта 2020

Добрый день,

У меня есть следующее XML в качестве ввода:

<?xml version="1.0" encoding="UTF-8"?>

-<S:Envelope xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">


-<S:Header>


-<wsse:Security S:mustUnderstand="1">


-<wsu:Timestamp wsu:Id="_1" xmlns:ns13="http://www.w3.org/2003/05/soap-envelope" xmlns:ns14="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" xmlns:ns15="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">

<wsu:Created>2020-03-27T19:04:20Z</wsu:Created>

<wsu:Expires>2020-03-27T19:09:20Z</wsu:Expires>

</wsu:Timestamp>

</wsse:Security>

</S:Header>


-<S:Body>


-<S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">

<faultcode>S:Server</faultcode>

<faultstring>Ocorreu um erro no serviço</faultstring>


-<detail>


-<ns3:DataLicensingFault xmlns:ns3="http://services.experian.com.br/DataLicensing/DataLicensingService/" xmlns:ns2="http://www.experian.com.br/schema/infocleanws">

<codeReason>100</codeReason>

<reason>Parâmetro cnpj é inválido.</reason>

</ns3:DataLicensingFault>

</detail>

</S:Fault>

</S:Body>

</S:Envelope>

Мне нужно получить значение, найденное в теге codeReason.

Для это я использую следующую команду

<xsl: variable name = "vCodeReason" select = "./ soapenv: Fault / detail / DataLicensingFault / codeReason" />

Но я получаю значение белого для переменной vCodeReason.

Правильнее было бы получить значение 100.

Я отправляю программу xslt:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output omit-xml-declaration="no" indent="yes" encoding="utf-8"/>
   <xsl:template match="/">
      <!-- Campos do Datatype da Interface :-->
      <xsl:variable name="vFaultCode" select="./soapenv:Fault/faultcode"/>
      <xsl:variable name="vFaultString" select="./soapenv:Fault/faultstring"/>
      <xsl:variable name="vCodeReason" select="./soapenv:Fault/detail/DataLicensingFault/codeReason"/>
      <xsl:variable name="vReason" select="./soapenv:Fault/detail/DataLicensingFault/reason"/>
      <xsl:choose>
         <xsl:when test="$vFaultCode!=&apos;&apos;">
            <ns0:ConsultarPJResponse xmlns:ns0="http://services.experian.com.br/DataLicensing/DataLicensingService/">
              <result>
                 <situacaoCadastral>
                     <codigoSituacao>
                        <xsl:value-of select="$vCodeReason"/>
                     </codigoSituacao>
                     <situacao>
                        <xsl:value-of select="$vFaultString"/>
                     </situacao>
                 </situacaoCadastral>
              </result>
            </ns0:ConsultarPJResponse>
         </xsl:when>
         <xsl:otherwise>
            <xsl:copy-of select="/"/>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>
</xsl:stylesheet>

Вы можете мне помочь?

1 Ответ

0 голосов
/ 31 марта 2020

Ваш шаблон соответствует узлу / root, а soapenv:Fault не является дочерним для этого узла. Это в дополнение к тому, что я сказал в комментарии относительно пространства имен DataLicensingFault.

Если хотите, вы можете сделать просто:

<xsl:variable name="vCodeReason" select="//codeReason"/>

Чтобы использовать явный путь от текущего узла, вам нужно сделать:

<xsl:variable name="vCodeReason" select="S:Envelope/S:Body/S:Fault/detail/ns3:DataLicensingFault/codeReason"/>

и включить два объявления пространства имен в начальном теге stylesheet.


Демонстрация : https://xsltfiddle.liberty-development.net/3MvmXiA

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