E mentre oggi sono tutti al primo giorno dei Community Days, io comincio a raccontarvi delle mie peripezie (mi immedesimo per un attimo nel byte di mio fratello) su Sharepoint.
Non amo molto raccontare un prodotto cominciando da zero sopratutto non su un blog (alla fine non vuole essere un manuale ma un workbench), quindi vado subito al sodo con una cosa che mi ha fatto un po' impazzire.
Per introdurre l'argomento, occorre fare prima delle azioni preliminari:
- Creiamo una Raccolta Documentale (Document Library per chi lo usa in inglese )
- Creiamo una Web Part Page e inseriamo la Web Part della Document Library appena creata
- Apriamo la pagina appena creata con FrontPage e convertiamo la Web Part in una XSLT Data View (click con il destro sulla Web Part e selezioniamo "Convert to XSLT Data View")
- Salviamo e torniamo alla nostra pagina sul browser
Qual'è il problema?
Cosa vogliamo capire e risolvere?
Beh l'idea iniziale (che analizzerò poi in un altro post) era quella di modificare la presentazione dei dati in un modo che ne i Windows Sharepoint Services ne Sharepoint Portal Server permettono, vedremo poi quale, per ora non scendiamo troppo nel dettaglio.
Quindi occorre creare un XSLT per la rappresentazione dei dati come la vogliamo noi.
Semplice direte voi.
Beh, non è detto.
Che XML ritorna la CAML di Sharepoint?
Se andate in modalità modifica (shared) della Web Part vedrete che ciò che genera Sharepoint è una query CAML molto simile a questa.
Come dice quel post: illeggibile e non documentata.
E' chiaro che, per produrre un XSLT quantomeno funzionante, occorra sapere da che XML bisogna partire, per cui il problema rimane.
Cosa vogliamo ottenere dunque?
Vogliamo fare in modo che ci venga mostrato l'XML che Sharepoint ritorna tramite la query CAML.
Per fare questo occorre modificare sia l'XSL che la Data Query.
Cominceremo prima da quest'ultima.
Data Query Editor
Clicchiamo su questo Button (sempre dalla modalità "Modify Shared Web Part") in modo che ci venga mostrata questa query.
Occorre sostituirla con una di questo tipo:
<udc:ConnectionInfo xmlns:udc="http://schemas.microsoft.com/data/udc" Purpose="Query" UDCVersion="1.0" SOAPVersion="1.0">
<udcs:Location xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" href="http://www.teur.ot/C12/C16/COSE/_vti_bin/dspsts.asmx">SoapDataAdapter</udcs:Location>
<udcs:SOAPAction xmlns:udcs="http://schemas.microsoft.com/data/udc/soap">http://schemas.microsoft.com/sharepoint/dsp/queryRequest</udcs:SOAPAction>
<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<dsp:queryRequest xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp">
<dsp:ptQuery> <dsp:Url>http://www.teur.ot/C12/C16/COSE/_vti_bin/dspsts.asmx</dsp:Url>
<dsp:soapAction>http://schemas.microsoft.com/sharepoint/dsp/queryRequest</dsp:soapAction>
<dsp:dspSOAPPT>StsAdapter</dsp:dspSOAPPT>
<dsp:Port>StsAdapterSoap</dsp:Port>
<dsp:WSDLURL>http://www.teur.ot/C12/C16/COSE/_vti_bin/dspsts.asmx?WSDL=1</dsp:WSDLURL>
<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:Header>
<request document="content" method="query" xmlns="http://schemas.microsoft.com/sharepoint/dsp"/>
<versions xmlns="http://schemas.microsoft.com/sharepoint/dsp">
<version>1.0</version>
</versions>
</soap:Header>
<soap:Body>
<queryRequest xmlns="http://schemas.microsoft.com/sharepoint/dsp">
<dsQuery select="/list[@id='{5F8A1506-3D1C-4500-90B6-200B148D8F2F}']" resultContent="dataOnly" columnMapping="element" resultRoot="Rows" resultRow="Row">
<Fields>
<AllFields/>
</Fields>
</dsQuery>
</queryRequest>
</soap:Body>
</soap:Envelope>
</dsp:ptQuery>
</dsp:queryRequest>
</soap:Body>
<soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<dsp:versions xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp">
<dsp:version>1.0</dsp:version>
</dsp:versions>
<dsp:request xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" document="content" method="query"/>
</soap:Header>
</udc:ConnectionInfo>
Avendo cura però di:
- Sostituire i vari URL e Path relativi alla Document Library (quelli che in questo esempio iniziano per "http://www.teur.ot/C12/C16/....." (il Web Service di questa DL)
- Sostituire l'ID della DL (select="/list[@id='{5F8A1506-3D1C-4500-90B6-200B148D8F2F}']") con l'ID della DL che vogliamo (basta cliccare su Manage Content o Manage Security della lista e l'ID lo si trova nella barra dell'indirizzo)
Source Editor
Per quanto riguarda il nostro XSLT occorre inserire un foglio di stile che permetta di ottenere l'identity XML, ovvero:
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ddw1="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl ddwrt msxsl" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
method="xml" indent="yes"/>
name="dvt_adhocmode"></xsl:param>
name="dvt_adhocfiltermode">xsl</xsl:param>
name="dvt_fieldsort"></xsl:param>
name="dvt_sortfield"></xsl:param>
name="dvt_groupfield"></xsl:param>
name="dvt_groupdisplay"></xsl:param>
name="dvt_sortdir"></xsl:param>
name="dvt_groupdir"></xsl:param>
name="dvt_grouptype"></xsl:param>
name="dvt_sorttype">text</xsl:param>
name="dvt_groupsorttype">text</xsl:param>
name="dvt_filterfield"></xsl:param>
name="dvt_filterval"></xsl:param>
name="dvt_filtertype"></xsl:param>
name="dvt_firstrow">1</xsl:param>
name="dvt_nextpagedata"></xsl:param>
name="dvt_apos">'</xsl:param>
name="filterParam"></xsl:param>
match="/">
<xmp> />
</xmp>
</xsl:template>
match="node()|@*">
select="@*"/>
/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Ora clicchiamo pure Apply o Ok.
Come per "magia" () ecco l'XML ritornato da Sharepoint.
Cosa farne?
Beh...qui spetta tutto a voi...sbizzaritevi con i vostri XSLT.
powered by IMHO 1.3