#1: Liste, XSLT e XML

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:

  1. Creiamo una Raccolta Documentale (Document Library per chi lo usa in inglese
  2. Creiamo una Web Part Page e inseriamo la Web Part della Document Library appena creata
  3. 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")
  4. 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

Print | posted @ Wednesday, April 12, 2006 3:17 PM

Comments on this entry:

Gravatar # re: #1: Liste, XSLT e XML
by Omar Damiani at 4/12/2006 4:07 PM

Si, conosco qualcosina di quel sito (l'ho sfogliato in queste giornate di lavoro su SPS).

Si, se vuoi mettermi in contatto, volentieri...
Grazie.
Gravatar # re: #1: Liste, XSLT e XML
by Omar Damiani at 2/6/2007 5:28 PM

I've never tried such a thing.
Take a look at: http://weblogs.asp.net/soever/archive/2005/02/26/381025.aspx

He used <dsp:allfields includehiddenfields="true"/>, I wonder if it works also with folders :))

Good Luck and let me know...
Comments have been closed on this topic.