Question

Je suis en train d'utiliser une partie Web de vue des données (via SPD 2007) de consommer les résultats d'un service Web SOAP et rendre des portions desdits résultats en utilisant des transformations XSL. Le problème que je vais avoir est que le concepteur est pas beaucoup d'aide parce que le schéma pour le service Web ne comprend pas réellement les éléments des résultats, donc il n'y a aucun moyen de glisser-déposer de la source de données dans la partie Web, et le manuel transforme je l'ai essayé ne fonctionnent pas.

Voici la définition du service 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>

Et la définition de la réponse:

<?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>

La définition de la requête est pas de problème - vous fournissez juste un symbole boursier comme une chaîne. Vous verrez ce que je parle dans les résultats, bien que. Elle définit le résultat comme une simple chaîne.

Dans SPD2007, la source de données assez comprend bien que soap:Envelope/soap:Body/GetQuoteResponse/GetQuoteResult, mais les résultats réels contenus dans la chaîne de résultat ressembler à ceci:

<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>

J'ai essayé la mise en place d'une feuille de style XSL comme celui-ci dans la vue des données Web partie:

<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>

fait à peu près ce que vous attendez: il rend toute la chaîne de résultat. Cependant, si je remplace

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

avec

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

Je ne reçois rien. Que se passe-t-il? comment puis-je utiliser XSL pour choisir le XML dans le résultat de la chaîne sans schéma?

Était-ce utile?

La solution

En regardant les vous utilisez il ne retourne les valeurs dans une chaîne avec

Heureusement, il existe un bon exemple dans ce post de cette question précise. Cette personne a fini par utiliser une fonction d'extension personnalisée écrite en C # pour convertir la chaîne en XML et puis ramenez-le à la XSLT pour le traitement régulier. La fonction personnalisée qu'ils utilisent est:

<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>

Et vous appelez la fonction sur votre chaîne:

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

Je ne peux pas garantir que la fonction personnalisée fonctionnera exactement comme vous en avez besoin, mais il devrait, espérons-vous vous rapprochez.

Autres conseils

On dirait que les résultats sont une chaîne, et non XML qui nécessitent un traitement en tant que tel. Je ne peux pas être sûr sans regarder le résultat xml.

Essayez d'ajouter <xmp><xsl:copy-of select="." /></xmp> et l'affichage des résultats.

Pouvez-vous enlever le match sur le savon. Enveloppe etc et le remplacer par correspondance "*"

Ensuite, à l'intérieur qui ajoute un

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

Si cela ne fournit pas les valeurs, l'appariement est pas correct. Essayez aussi

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

A la fin de la journée, vous êtes désireux d'obtenir quelque chose comme (sans voir le XML brut, je ne peux pas être sûr) Tout cela est pour le débogage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top