веб-часть просмотра данных sharepoint xslt без схемы - PullRequest
2 голосов
/ 03 марта 2010

Я пытаюсь использовать веб-часть представления данных (через SPD 2007), чтобы использовать результаты веб-службы на основе SOAP и визуализировать части этих результатов с использованием XSL-преобразований. У меня проблема в том, что дизайнер не очень помогает, потому что схема для веб-службы на самом деле не включает в себя элементы результатов, поэтому нет способа перетаскивания из источника данных в веб-часть, и ручные преобразования, которые я пытался, не работают.

Вот определение веб-службы:

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

И определение ответа:

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

Определение запроса не составляет проблемы - вы просто предоставляете биржевой символ в виде строки. Вы увидите, о чем я говорю в результатах. Он определяет результат как просто строку.

В SPD2007 источник данных в значительной степени включает только soap:Envelope/soap:Body/GetQuoteResponse/GetQuoteResult, но фактические результаты, содержащиеся в строке результатов, выглядят так:

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

Я попытался настроить таблицу стилей XSL, например, в веб-части представления данных:

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

Это делает в значительной степени то, что вы ожидаете: он отображает всю строку результата. Однако, если я заменю

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

с

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

Я ничего не понимаю. В чем дело? как использовать XSL для выделения XML в строковом результате без схемы?

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

Похоже, что результатом является строка, а не XML, которая потребует обработки как таковой. Я не могу быть уверен, не глядя на результат xml.

Попробуйте добавить <xmp><xsl:copy-of select="." /></xmp> и опубликовать результаты.

Можете ли вы удалить спичку на мыло: конверт и т.д. и заменить на спичку "*".

Затем внутри этого добавить

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

Если это не обеспечивает значения, сопоставление не является правильным. Также попробуйте

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

В конце дня вы хотите получить что-то вроде (не видя необработанного XML, я не могу быть уверен) Это все для отладки.

1 голос
/ 05 марта 2010

При просмотре службы , которую вы используете , она возвращает значения в строке с <, делая ее похожей на XML. Я не могу представить, почему они это сделали, но вам нужно проанализировать строку как XML, чтобы обработать ее. Для этого нет встроенной функции XSLT, поэтому вам придется использовать функцию расширения. Я не знаю ни одного из Microsoft, поэтому вам придется написать свой собственный. </p>

К счастью, в этом посте есть хороший пример этого точного вопроса. Этот человек в итоге использовал пользовательскую функцию расширения, написанную на c #, чтобы преобразовать строку в XML и затем передать ее обратно в XSLT для обычной обработки. Пользовательская функция, которую они используют:

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

И затем вы вызываете функцию в вашей строке:

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

Я не могу гарантировать, что пользовательская функция будет работать именно так, как вам нужно, но, надеюсь, она приблизит вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...