#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 on mercoledì 12 aprile 2006 15.17

Feedback

# re: #1: Liste, XSLT e XML

Left by Igor A. at 12/04/2006 15.52
Gravatar Ehi! Anche se non ci capisco molto di Sharepoint...good tip!

Conosci / hai dato 1 occhio a ugisharepoint ?
www.ugisharepoint.it ... lo gestiscono gli amici di codearchitects ... se t'interessa ti metto in contatto: questo mi sembra un tip tipico della sezione Tips&Tricks.

Igor A.

# re: #1: Liste, XSLT e XML

Left by Omar Damiani at 12/04/2006 16.07
Gravatar Si, conosco qualcosina di quel sito (l'ho sfogliato in queste giornate di lavoro su SPS).

Si, se vuoi mettermi in contatto, volentieri...
Grazie.

# re: #1: Liste, XSLT e XML

Left by Serg DN at 06/02/2007 15.20
Gravatar Hello!

I tried using your code of <queryRequest> and using code from SDK, but I don't receive folders in response (only documents).

How do you get folders from Document library over DspSts?

Thanks.

# re: #1: Liste, XSLT e XML

Left by Omar Damiani at 06/02/2007 17.28
Gravatar 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...

# Horse sex.

Left by Horse sex. at 14/06/2008 3.50
Gravatar Horse sex.

# Free dog sex.

Left by Dog sex. at 21/07/2008 12.07
Gravatar Sex animal dog.

Your comment:





 
Please add 2 and 3 and type the answer here:

Copyright © Omar Damiani

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski