Pergunta

Estou tentando usar uma parte da web de exibição de dados (via SPD 2007) para consumir os resultados de um serviço da Web baseado em SOAP e renderizar partes dos referidos resultados usando transformadas XSL. O problema que estou tendo é que o designer não é de muita ajuda, porque o esquema do serviço da web não inclui os elementos dos resultados; portanto, não há como arrastar e cair da fonte de dados para a Web Part, E as transformações manuais que tentei não estão funcionando.

Aqui está a definição do serviço da web:

<?xml version="1.0" encoding="utf-8"?>
<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:Body>
    <GetQuote xmlns="http://www.webserviceX.NET/">
      <symbol>string</symbol>
    </GetQuote>
  </soap:Body>
</soap:Envelope>

E a definição da resposta:

<?xml version="1.0" encoding="utf-8"?>
<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:Body>
    <GetQuoteResponse xmlns="http://www.webserviceX.NET/">
      <GetQuoteResult>string</GetQuoteResult>
    </GetQuoteResponse>
  </soap:Body>
</soap:Envelope>

A definição de consulta não é problema - basta fornecer um símbolo de ticker de estoque como uma string. Você verá o que estou falando nos resultados. Ele define o resultado como apenas uma string.

No SPD2007, a fonte de dados praticamente inclui apenas soap:Envelope/soap:Body/GetQuoteResponse/GetQuoteResult, mas os resultados reais contidos na string de resultado são assim:

<StockQuotes>
  <Stock>
    <Symbol>MSFT</Symbol>
    <Last>28.465</Last>
    <Date>3/3/2010</Date>
    <Time>1:24pm</Time>
    <Change>+0.005</Change>
    <Open>28.52</Open>
    <High>28.61</High>
    <Low>28.35</Low>
    <Volume>28380812</Volume>
    <MktCap>249.7B</MktCap>
    <PreviousClose>28.46</PreviousClose>
    <PercentageChange>+0.02%</PercentageChange>
    <AnnRange>14.87 - 31.50</AnnRange>
    <Earns>1.815</Earns>
    <P-E>15.68</P-E>
    <Name>Microsoft Corpora</Name>
  </Stock>
</StockQuotes>

Tentei configurar uma folha de estilo XSL como esta na Web Part: Data View:

<xsl:stylesheet xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                        xmlns:ddw1="http://www.webserviceX.NET/"
                        version="1.0"
                        exclude-result-prefixes="xsl msxsl ddwrt"
                        xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
                        xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
                        xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
                        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                        xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                        xmlns:SharePoint="Microsoft.SharePoint.WebControls"
                        xmlns:ddwrt2="urn:frontpage:internal">
            <xsl:output method="html" indent="yes"/>
            <xsl:param name="dvt_apos">'</xsl:param>
            <xsl:template match="/soap:Envelope/soap:Body/ddw1:GetQuoteResponse">
                <xsl:value-of select="*" />             
            </xsl:template>
        </xsl:stylesheet>

Isso faz praticamente o que você esperaria: renderiza toda a string de resultado. No entanto, se eu substituir

<xsl:template match="/soap:Envelope/soap:Body/ddw1:GetQuoteResponse">
  <xsl:value-of select="*" />               
</xsl:template>

com

<xsl:template match="/soap:Envelope/soap:Body/ddw1:GetQuoteResponse">
  <xsl:value-of select="//Symbol" />                
</xsl:template>

Não recebo nada. O que está acontecendo? Como uso o XSL para escolher o XML no resultado da string sem um esquema?

Foi útil?

Solução

Ao olhar para o serviço que você está usando Ele retorna os valores em uma string com <fazendo com que pareça xml. Não consigo imaginar por que eles fariam isso, mas você precisará analisar a string como XML para processá -la. Não existe uma função XSLT nativa para fazer isso, então você terá que usar uma função de extensão. Não conheço um da Microsoft, então você terá que escrever o seu.

Felizmente há um bom exemplo neste post dessa pergunta exata. Essa pessoa acabou usando uma função de extensão personalizada escrita em C# para converter a string em XML e, em seguida, passá -la de volta ao XSLT para processamento regular. A função personalizada que eles usam é:

<msxml:script language="CSharp" implements-prefix="cd">
<msxml:using namespace="System.IO" />

    public XPathNodeIterator parse(string data) {
        if(data==null || data.Length==0) {
            data="&lt;Empty /&gt;";
        }
        StringReader stringReader = new StringReader(data);
        XPathDocument xPathDocument = new XPathDocument(stringReader);
        XPathNavigator xPathNavigator = xPathDocument.CreateNavigator();
        XPathExpression xPathExpression = xPathNavigator.Compile("/");
        XPathNodeIterator xPathNodeIterator = xPathNavigator.Select(xPathExpression);
        return xPathNodeIterator;
    }
</msxml:script>

E então você chama a função em sua string:

<xsl:variable name="theXML" select="string(/string)" />
<xsl:variable name="list" select="cd:parse($theXML)" />

Não posso garantir que a função personalizada funcione exatamente da maneira que você precisa, mas espero que você feche.

Outras dicas

Parece que os resultados são uma string, não XML que exigiria processamento como tal. Não posso ter certeza sem olhar para o resultado XML.

Tente adicionar <xmp><xsl:copy-of select="." /></xmp> e publicar os resultados.

Você pode remover a correspondência no sabão: envelope etc e substituir por correspondência "*".

Então, dentro disso, adicione um

<p>Symbol:<xsl:value-of select="/StockQuotes/Stock/Symbol" /></p> 

Se isso não fornecer valores, a correspondência não estará correta. Tente também

<p>Symbol:<xsl:value-of select="/soap:Envelope/soap:Body/ddw1:GetQuoteResponse/StockQuotes/Stock/Symbol" /></p>

No final do dia, você deseja obter algo como (sem ver o XML bruto, não posso ter certeza), tudo isso é para depuração.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top