2017-01-13 3 views
-1

Во-первых, я предоставлю код, который у меня уже есть. XML:Извлечение строки XSL из ответа SOAP

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <getUserDataResponse xmlns="http://wtp"> 
     <getUserDataReturn>Matt</getUserDataReturn> 
     <getUserDataReturn>NY</getUserDataReturn> 
     </getUserDataResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Это XSLT У меня есть:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope"> 
<xsl:output method="xml" omit-xml-declaration="no" encoding="utf-8" indent="yes" /> 
    <xsl:template match="/"> 
     <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
      <soapenv:Body> 
       <getUserDataResponse xmlns="http://wtp"> 
        <xsl:for-each select="soapenv:Envelope/soapenv:Body/soapenv:getUserDataResponse/soapenv:getUserDataReturn"> 
         <xsl:value-of select="." /> 
        </xsl:for-each> 
       </getUserDataResponse> 
      </soapenv:Body> 
     </soapenv:Envelope> 
    </xsl:template> 
</xsl:stylesheet> 

Что я пытаюсь добиться, чтобы извлечь только первый элемент массива, в этом случае строка «Мэтта, а затем положить его, как это было просто регулярный ответ, чтобы отправить его дальше на другую конечную точку ». Я понятия не имею, что может быть неправильным.

Выход я хочу:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <getUserDataResponse xmlns="http://wtp"> 
     <getUserDataReturn>Matt</getUserDataReturn> 
     </getUserDataResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Выход я получаю сейчас просто шаблон мыло без данных.

Был бы очень признателен, если кто-то может помочь :)

Ура!

ответ

0

Выход вы хотите, может быть достигнута с помощью:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:wtp="http://wtp"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

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

<xsl:template match="wtp:getUserDataResponse"> 
    <xsl:copy> 
     <xsl:apply-templates select="wtp:getUserDataReturn[1]"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Чтобы сделать это так, как вы начали, вы должны сделать:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:wtp="http://wtp"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <soapenv:Body> 
      <getUserDataResponse xmlns="http://wtp"> 
       <getUserDataReturn> 
        <xsl:value-of select="soapenv:Envelope/soapenv:Body/wtp:getUserDataResponse/wtp:getUserDataReturn[1]" /> 
       </getUserDataReturn> 
      </getUserDataResponse> 
     </soapenv:Body> 
    </soapenv:Envelope> 
</xsl:template> 

</xsl:stylesheet> 

Примечание к использование префикса для выбора элементов в пространстве имен "http://wtp" по умолчанию.

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