2 Stimmen

Sharepoint Datenansicht Webpart Xslt ohne Schema

Ich versuche, ein Datenansicht-Webpart (über SPD 2007) zu verwenden, um die Ergebnisse eines SOAP-basierten Webdienstes zu konsumieren und Teile dieser Ergebnisse mithilfe von XSL-Transformationen zu rendern. Das Problem, das ich habe, ist, dass der Designer keine große Hilfe ist, weil das Schema für den Webdienst nicht wirklich die Elemente der Ergebnisse enthält, so dass es keine Möglichkeit gibt, Drag & Drop aus der Datenquelle in das Webpart zu ziehen, und die manuellen Transformationen, die ich versucht habe, funktionieren nicht.

Hier ist die Definition des Webdienstes:

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

Und die Definition der Antwort:

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

Die Abfragedefinition ist kein Problem - Sie geben einfach ein Börsenkürzel als String an. In den Ergebnissen sehen Sie jedoch, wovon ich spreche. Es definiert das Ergebnis als eine Zeichenfolge.

In SPD2007 umfasst die Datenquelle so gut wie nur soap:Envelope/soap:Body/GetQuoteResponse/GetQuoteResult , aber die tatsächlichen Ergebnisse in der Ergebniszeichenfolge sehen so aus:

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

Ich habe versucht, ein XSL-Stylesheet wie dieses in der Datenansicht Webpart einzurichten:

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

Dies tut so ziemlich das, was man erwarten würde: Es wird die gesamte Ergebniszeichenkette wiedergegeben. Wenn ich jedoch ersetze

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

mit

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

Ich bekomme nichts. Was ist los? Wie verwende ich XSL, um die XML in der Zeichenfolge Ergebnis ohne ein Schema zu holen?

2voto

Nat Punkte 14020

Es sieht so aus, als wären die Ergebnisse eine Zeichenkette und nicht XML, was eine Verarbeitung als solche erfordern würde. Ich kann nicht sicher sein, ohne einen Blick auf das Ergebnis xml.

Versuchen Sie <xmp><xsl:copy-of select="." /></xmp> und Veröffentlichung der Ergebnisse.

Können Sie die Übereinstimmung bei soap:Envelope usw. entfernen und durch die Übereinstimmung "*" ersetzen?

Dann fügen Sie darin eine

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

Wenn das keine Werte liefert, ist der Abgleich nicht korrekt. Versuchen Sie auch

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

Letzten Endes möchten Sie etwas erhalten wie (ohne die rohe xml zu sehen, kann ich nicht sicher sein) Dies ist alles für die Fehlersuche.

1voto

Peter Jacoby Punkte 2411

Bei der Betrachtung der Dienst, den Sie benutzen werden die Werte in einer Zeichenkette mit < zurückgegeben, so dass es wie XML aussieht. Ich kann mir nicht vorstellen, warum sie das tun, aber Sie müssen die Zeichenkette als XML parsen, um sie zu verarbeiten. Es gibt keine systemeigene XSLT-Funktion, um dies zu tun, also müssen Sie eine Erweiterungsfunktion verwenden. Mir ist keine von Microsoft bekannt, also müssen Sie Ihre eigene schreiben.

Glücklicherweise gibt es eine gutes Beispiel in diesem Beitrag auf genau diese Frage. Diese Person endete mit einer benutzerdefinierten Erweiterung Funktion in c# geschrieben, um die Zeichenfolge in XML zu konvertieren und dann übergeben Sie es zurück zu den XSLT für die regelmäßige Verarbeitung. Die benutzerdefinierte Funktion, die sie verwenden, ist:

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

Und dann rufen Sie die Funktion mit Ihrer Zeichenkette auf:

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

Ich kann nicht garantieren, dass die benutzerdefinierte Funktion genau so funktioniert, wie Sie es brauchen, aber sie sollte Ihnen hoffentlich weiterhelfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X