2010-03-03 5 views
2

SOAP 뷰 기반 웹 서비스의 결과를 소비하고 XSL 변환을 사용하여 결과의 ​​일부를 렌더링하기 위해 데이터 뷰 웹 파트 (SPD 2007 사용)를 사용하려고합니다. 제가 가지고있는 문제는 웹 서비스의 스키마가 결과의 요소를 실제로 포함하지 않기 때문에 디자이너가별로 도움이되지 않는다는 것입니다. 따라서 데이터 소스에서 웹 파트로 드래그 앤 드롭 할 방법이 없습니다. 시도한 수동 변환이 작동하지 않습니다.셰어 포인트 데이터보기 스키마가없는 웹 파트 xslt

<?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을 포함하지만, 결과 문자열에 포함 된 실제 결과는 다음과 같다 : I 데이터에서이 같은 XSL 스타일 시트를 설정하려고했습니다

<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: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="//Symbol" />     
</xsl:template> 

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

을 대체합니다. 무슨 일이야? 스키마없이 문자열 결과에서 XML을 선택하기 위해 XSL을 사용하려면 어떻게해야합니까?

+1

이는 * 실제 *의 XML 결과를 게시하시기 바랍니다' ...'또는' <StockQuotes> ... </StockQuotes >'. 나는 후자라고 생각합니다.이 경우에 당신은 꽤 망쳐 놨습니다. 그리고 가능하다면 그것을 이전으로 변경하려고 노력해야합니다. – Tomalak

답변

1

service you are using을 보면 <이라는 문자열로 값을 반환하므로 XML처럼 보입니다. 나는 왜 이것을 할 지 상상할 수 없지만, 문자열을 처리하기 위해서는 문자열을 XML로 파싱해야 할 것이다. 이를 수행 할 원시 XSLT 기능이 없으므로 확장 기능을 사용해야합니다. Microsoft에서 제공하는 제품에 대해 잘 모르는 경우 직접 작성해야합니다.

다행히도이 정확한 질문은 good example in this post입니다. 이 사람은 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)" /> 

나는 사용자 정의 기능이 정확하게 당신이 그것을 필요로하는 방식으로 작동을 보장하지 수 있지만, 잘하면 가까이 가야합니다. 당신이 경우 완전히 명확하지 않기 때문에

2

결과가 XML이 아닌 문자열로 처리되는 것처럼 보입니다. 나는 결과 XML을 보지 않고 확신 할 수 없다.

<xmp><xsl:copy-of select="." /></xmp>을 추가하고 결과를 게시 해보십시오.

비누 : 봉투 등에서 경기를 제거하고 "*"와 일치시킬 수 있습니까? 그 값을 제공하지 않으면

이어서 그 안에

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

추가 매칭은 정확하지 않다. 또한이 모든 디버깅을위한 (I 확신 할 수없는 원시 XML을 보지 않고) 당신이 뭔가를 얻을하고자하는 하루의 끝에서

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

을 시도합니다.

+0

내 select = "*"템플릿과 거의 비슷하게 렌더링됩니다. –

+0

응답의 원시 xml을 볼 수 있다면 무슨 일이 일어나는지 알아볼 수 있습니다. – Nat

관련 문제