2010-03-03 9 views
2

J'essaie d'utiliser un composant WebPart de visualisation de données (via SPD 2007) pour consommer les résultats d'un service Web basé sur SOAP et rendre des portions de ces résultats en utilisant des transformations XSL. Le problème que j'ai est que le concepteur n'est pas beaucoup d'aide parce que le schéma pour le service Web n'inclut pas réellement les éléments des résultats, donc il n'y a aucun moyen de faire glisser et déposer de la source de données dans la partie web, et les transformations manuelles que j'ai essayées ne fonctionnent pas.vue des données sharepoint partie Web xslt sans schéma

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 chaîne. Vous verrez de quoi je parle dans les résultats, cependant. Il définit le résultat comme une simple chaîne.

En 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 ressemble à 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 les données voir partie web:

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

Cela fait à peu près ce à quoi vous vous attendez: il restitue la chaîne de résultat entière. 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 un schéma?

+1

S'il vous plaît, afficher les * résultat XML réelle *, car il est pas tout à fait clair si vous avez ' ...' 'ou <StockQuotes> ... </StockQuotes > '. Je soupçonne que c'est le dernier, auquel cas vous êtes assez foutu (et devrait essayer de le changer dans le premier, si c'est possible). – Tomalak

Répondre

1

En regardant le service you are using, il retourne les valeurs dans une chaîne avec < ce qui lui donne l'aspect de XML. Je ne peux pas imaginer pourquoi ils feraient cela, mais vous devrez analyser la chaîne en XML pour la traiter. Il n'y a pas de fonction XSLT native pour cela, donc vous devrez utiliser une fonction d'extension. Je n'en connais pas de Microsoft donc vous devrez écrire le vôtre.

Heureusement il y a un good example in this post de cette question. Cette personne a fini par utiliser une fonction d'extension personnalisée écrite en C# pour convertir la chaîne en XML et la renvoyer ensuite à XSLT pour un 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 puis 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 J'espère que vous serez proche.

2

On dirait que les résultats sont une chaîne, pas un code XML qui nécessiterait 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 de publier les résultats. Pouvez-vous supprimer l'allumette sur du savon: Enveloppe etc et remplacer par "*".

Ensuite, à l'intérieur qui ajoutent une

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

+0

il rend à peu près comme mon modèle select = "*". –

+0

Si je peux voir le XML brut de la réponse, je peux essayer de savoir ce qui se passe. – Nat