Oversikt og mål
Esken, MOSS’ Webdelen for innholdsspørring (CQWP) viser resultatene i listeformat, lik søkeresultater. Det er også mulig å vise resultatene i et rutenettformat (dvs.. HTML tabellformat). Rutenettet er bedre i enkelte tilfeller. Jeg beskrive hvordan å oppnå den effekten i denne artikkelen.
Virksomhet Scenario
Jeg har jobbet med en klient på en bedriftsomfattende MOSS distribusjon. Vi har utformet sine taksonomi slik at prosjekter er førsteklasses borgere i hierarkiet og har sin egen området på toppnivå. Prosjektledere vedlikeholde en singleton liste over sammendragsinformasjon for prosjektet, som tittelen, budsjett, forventet fullføringsdato, Gjenstående budsjett og andre oppsummeringstype felt. Av "singleton" Jeg mener en egendefinert SharePoint-liste som er garantert å inneholde bare ett element. Simplistically, Det ser ut som dette:
Tekniske tilnærmingen er mye det samme som beskrevet her (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP bruker en XSL-transformasjon for å avgi HTML for leseren for å gjengi.
Envision jeg alltid resultatet før dykking i XSL fordi XSL er et mareritt. Her er min ønsket resultat:
HTML som dette genererer resultatet:
<HTML> <kroppen> <Center> <tabell kantlinje= 1> <!-- Etiketter-> <tr BgColor= blå> <TD><skrift farge= hvit><b>Prosjektnavnet</b></skrift></TD> <TD justere= høyre><skrift farge= hvit><b>Fullført dato</b></skrift></TD> <TD justere= høyre><skrift farge= hvit><b>Budsjett</b></skrift></TD> <TD justere= høyre><skrift farge= hvit><b>Faktiske kostnader</b></skrift></TD> <TD><skrift farge= hvit><b>Samlet Status</b></skrift></TD> </tr> <tr> <TD>Re-wire datarom.</TD> <TD justere= høyre>02/01/08</TD> <TD justere= høyre>22,500.00</TD> <TD justere= høyre>19,000.00</TD> <TD>Pågår</TD> </tr> <tr> <TD>Bestemmelsen servere for SQL Upgrade</TD> <TD justere= høyre>04/01/08</TD> <TD justere= høyre>7,500.00</TD> <TD justere= høyre>0.00</TD> <TD>Planlagt</TD> </tr> </tabell> </Center> </kroppen> </HTML> |
Tilnærming
Følg denne fremgangsmåten for å opprette rutenettet:
- Komponentene i rutenettet (rader/kolonner).
- Definerer og nødvendig områdekolonner.
- Opprette sub-områder for prosjekter og singleton lister.
- Legge til CQWP til en webside og konfigurere den til å søke for listene.
- Endre det CQWP XML til å samle tilleggskolonnene.
- Endre XSL for å generere en tabell.
Jeg skal konsentrere nummer seks. Tallene en gjennom fire er rett fram og noe som CQWP brukere har allerede gjort. Nummer fem er veldokumentert av andre inkludert denne uttømmende skjermbilde laden artikkelen fra MSDN her (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) og Heather Solomons blogg her (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Muttere og bolter
Begynner og implementere trinn en til fem i MSDN-dokumentasjonen og Heather Solomons artikkel.
På dette punktet, du har lagt til din CQWP til siden og du har din <CommonViewFields> konfigurert som nødvendig.
Vanlige fremgangsmåten, Jeg får disse mellomliggende resultater:
1. Opprette en innholdstype, en malbasert liste for innholdstypen og to områder. Her er innholdstypen:
Her er områdestrukturen:
2. Legge til CQWP når du har opprettet min prosjektet sekundære områder og singleton prosjektet Sammendrag lister:
3. Legge til den ekstra informasjonen jeg ønsker via den <CommonViewFields>:
<egenskapen navn="CommonViewFields" type="streng">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</egenskapen>
Merk at jeg måtte holde alle egenskapsfelt på én linje, eller det ville ikke fungere (CQWP ville fortelle meg at spørringen returnerte ingen elementer).
4. På dette punktet, Vi er klare til å MSDN-artikkelen og snu på Heather Solomons artikkel. Følg hennes fremgangsmåte begynner nær trinn #5 opprette en tilpasset / unghosted versjon av ItemStyle.xsl. Jeg følger Heather råd, opp gjennom trinn 11 og få disse midlertidige resultater:
4.1: Navnet mitt XSL-mal som følger:
<XSL:malnavnet = "rutenett" matche = "rad[@Style = 'Rutenett']" Mode = "itemstyle">
Jeg endre også litt henne foreslo <XSL:for each …> ved å legge til en <br /> kode for å gi en renere liste:
<XSL:for each Velg="@*"> P:<XSL:verdien av Velg="navn()" /><br/> </XSL:for each>
4.2: Jeg endre webdelen, gå til utseende og velg min "rutenett" stil:
Før endringen og her er resultatet:
Vi kan se fra ovenfor at feltene vi ønsker (Prosjektnavnet, bekostning, status, osv.) er tilgjengelig for oss å bruke når vi sender ut HTML. Ikke bare det, men vi se navnene som vi må referere til disse kolonnene i XSL. For eksempel, Vi referanse prosjektstatus som "Project_x005F_x0020_Name".
På dette punktet, Vi går fra Heathers blogg og skuldrene til disse gigantene, Jeg legger min egen litt.
ContentQueryMain.xsl
NOTE: Når endringer både ContentQueryMain.xsl samt ItemStyle.xsl, du må sjekke filene tilbake i før du ser effekten av endringene.
Rutenett-making forbindelse, MOSS bruker to forskjellige XSL-filer for å produsere resultatene vi ser fra en CQWP. Generere den forrige bit av utdata, vi endret ItemStyle.xsl. MOSS faktisk bruker en XSL-fil, ContentQueryMain.xsl til i forbindelse med ItemStyle.xsl til å generere dens HTML. Som navnet tilsier, ContentQueryMain.xsl er den "viktigste" XSL som styrer den samlede flyten i oversettelse. Det går gjennom alle funnet elementene og sender dem én etter én til malene i ItemStyle.xsl. Vi vil endre ItemStyle.xsl for å generere åpne <tabell> før emitting den første raden med data og lukking <tabell> koden etter emitting siste. Å oppnå dette, ContentQueryMain.xsl er endret for å sende to parametere til våre "rutenett" malen i ItemStyle.xsl, "siste rad" og "gjeldende rad". ItemStyle.xsl bruker dette til betinget avgir de nødvendige kodene.
Bruke Heather Solomons teknikken, Vi finner ContentQueryMain.xsl. Det ligger på samme sted som ItemStyle.xsl. Dette skjermbildet skal hjelpe:
Vi må gjøre følgende endringer:
- Endre en xsl-mal, "CallItemTemplate" som påkaller faktisk våre rutenettet malen i ItemStyle.xsl. Vi passerer to parametere for rutenettet malen slik at den har dataene må betinget generering åpning og lukking <tabell> Tags.
- Endre en annen bit av ContentQueryMain.xsl som kaller "CallItemTemplate" skjedde det en "LastRow" parameteren slik at LastRow kan bli gitt videre til vår rutenettet mal.
Finn malen kalt "OuterTemplate.CallItemTemplate" identifisert av strengen:
<XSL:mal navn="OuterTemplate.CallItemTemplate">
Erstatte hele malen som følger:
<XSL:mal navn="OuterTemplate.CallItemTemplate"> <XSL:param navn="CurPosition" /> <!-- Legge til LastRow"" parameteren. Vi bare bruker den når elementet stil trinnet er "Rutenett". --> <XSL:param navn="LastRow" /> <XSL:Velg> <XSL:når test="@Style = 'NewsRollUpItem'"> <XSL:bruke-maler Velg="." modus="itemstyle"> <XSL:med param navn="EditMode" Velg="$cbq_iseditmode" /> </XSL:bruke-maler> </XSL:når> <XSL:når test="@Style = 'NewsBigItem'"> <XSL:bruke-maler Velg="." modus="itemstyle"> <XSL:med param navn="CurPos" Velg="$CurPosition" /> </XSL:bruke-maler> </XSL:når> <XSL:når test="@Style = 'NewsCategoryItem'"> <XSL:bruke-maler Velg="." modus="itemstyle"> <XSL:med param navn="CurPos" Velg="$CurPosition" /> </XSL:bruke-maler> </XSL:når> <!-- Pass nåværende posisjon og lastrow i malen rutenett itemstyle.xsl. ItemStyle.xsl vil bruke det til å avgi åpne og lukke <tabell> Tags. --> <XSL:når test="@Style = 'Rutenett'"> <XSL:bruke-maler Velg="." modus="itemstyle"> <XSL:med param navn="CurPos" Velg="$CurPosition" /> <XSL:med param navn="Siste" Velg="$LastRow" /> </XSL:bruke-maler> </XSL:når> <XSL:ellers> <XSL:bruke-maler Velg="." modus="itemstyle"> </XSL:bruke-maler> </XSL:ellers> </XSL:Velg> </XSL:mal> |
Kommentarer beskriver hensikten med endringene.
selvfølgelig, "-OuterTemplate.CallItemTemplate" kalles seg fra en annen mal. Finn malen ved å søke etter denne tekststrengen:
<XSL:mal navn="OuterTemplate.Body">
Bla gjennom instruksjonene i OuterTemplate.Body og setter parameteren LastRow som følger (vises som en kommentar i kursiv):
<XSL:samtale-mal navn="OuterTemplate.CallItemTemplate"> <XSL:med param navn="CurPosition" Velg="$CurPosition" /> <!-- Sette parameteren LastRow. --> <XSL:med param navn="LastRow" Velg="$LastRow"/> </XSL:samtale-mal>
Etter alt dette, Vi endelig har ting satt opp riktig slik at våre ItemStyle.xsl kan avgi <tabell> koder på rett sted.
ItemStyle.Xsl
NOTE: Igjen, innsjekking ItemStyle.xsl etter gjør endringer slik at du ser effekten av endringene.
Vi har to aktiviteter:
- Erstatte malen for hele rutenettet. Du kan kopiere/lime nedenfor.
- Legge noe mumbo jumbo utenfor maldefinisjonen som gjør "formatcurrency" mal å arbeide. (Du kan fortelle at jeg har en spinkel håndtak på XSL).
Første, øverst på ItemStyle.xsl, Legg til denne linjen:
<!-- Noe mumbo jumbo som lar oss vise USA. valuta. --> <XSL:desimal-format navn="ansatte" siffer="D" /> <XSL:mal navn="Standard" kamp="*" modus="itemstyle">
Merk at jeg la det direkte før den <XSL:malnavnet = "retten" …> definisjon.
Neste, gå tilbake til vår rutenettet mal. Erstatte malen for hele rutenettet med koden nedenfor. Det er godt kommentert, men ikke nøl med å email meg eller forlate kommentarer på bloggen min hvis du har spørsmål.
<XSL:mal navn="Rutenett" kamp="Rad[@Style = 'Rutenett']" modus="itemstyle"> <!-- ContentMain.xsl går CurPos og siste. Vi bruker disse til betinget avgir åpne og lukke <tabell> Tags. --> <XSL:param navn="CurPos" /> <XSL:param navn="Siste" /> <!-- Følgende variabler er uendret fra den standard ItemStyle.xsl --> <XSL:variabel navn="SafeImageUrl"> <XSL:samtale-mal navn="OuterTemplate.GetSafeStaticUrl"> <XSL:med param navn="UrlColumnName" Velg="'ImageUrl'"/> </XSL:samtale-mal> </XSL:variabel> <XSL:variabel navn="SafeLinkUrl"> <XSL:samtale-mal navn="OuterTemplate.GetSafeLink"> <XSL:med param navn="UrlColumnName" Velg="'LinkUrl'"/> </XSL:samtale-mal> </XSL:variabel> <XSL:variabel navn="DisplayTitle"> <XSL:samtale-mal navn="OuterTemplate.GetTitle"> <XSL:med param navn="Tittel" Velg="@Title"/> <XSL:med param navn="UrlColumnName" Velg="'LinkUrl'"/> </XSL:samtale-mal> </XSL:variabel> <XSL:variabel navn="LinkTarget"> <XSL:Hvis test="@OpenInNewWindow = "True"" >_blank</XSL:Hvis> </XSL:variabel> <!-- Her definere vi en variabel, "tableStart". Denne inneholder HTML som vi bruker til å definere åpningen av tabellen samt kolonneetikettene. Merk at hvis CurPos = 1, Det inkluderer HTML i en CDATA-kode. Ellers, det vil være tomt. Verdien for tableStart er emited hver gang ItemStyle kalles via ContentQueryMain.xsl. --> <XSL:variabel navn="tableStart"> <XSL:Hvis test="$CurPos = 1"> <![CDATA[ <tabellkantlinjen = 1> <St bgcolor = "blue"> <TD><skriftfarge = "hvit"><b>Prosjektnavnet</b></skrift></TD> <TD Juster = "høyre"><skriftfarge = "hvit"><b>Fullført dato</b></skrift></TD> <TD Juster = "høyre"><skriftfarge = "hvit"><b>Budsjett</b></skrift></TD> <TD Juster = "høyre"><skriftfarge = "hvit"><b>Faktiske kostnader</b></skrift></TD> <TD><skriftfarge = "hvit"><b>Samlet Status</b></skrift></TD> </tr> ]]> </XSL:Hvis> </XSL:variabel> <!-- En annen variabel, tableEnd bare definerer avslutningskoden tabellen kode. Som med tableStart, Det er alltid emited. Derfor verdien tilordnes betinget basert på om har vi passert siste av ContentQueryMain.xsl. --> <XSL:variabel navn="tableEnd"> <XSL:Hvis test="$CurPos = $Last"> <![CDATA[ </tabell> ]]> </XSL:Hvis> </XSL:variabel> <!-- Alltid avgi innholdet i tableStart. Hvis dette ikke er den første raden passerte oss ContentQueryMain.xsl, så vet vi verdien være tom. Deaktiverer utgang rømmer fordi når tableStart det ikke tomme, den inneholder selve HTML som vi skal gjengis i leseren. Hvis vi ikke forteller utgang XSL parseren deaktiverer rømme, det vil generere ting som"<tabell>" i stedet for"<tabell>". --> <XSL:verdien av Velg="$tableStart" Deaktiver-utdata-unnslippe="ja"/> <tr> <!-- P:Project_x005F_x0020_Name P:Project_x005F_x0020_End_x005F_x0020_Date P:Project_x005F_x0020_Budget P:Project_x005F_x0020_Expenses P:Project_x005F_x0020_Status --> <TD> <XSL:verdien av Velg="@Project_x005F_x0020_Name"/> </TD> <TD justere="høyre"> <XSL:verdien av Velg="@Project_x005F_x0020_End_x005F_x0020_Date"/> </TD> <TD justere="høyre"> <XSL:samtale-mal navn="FormatCurrency"> <XSL:med param navn="verdi" |
Dette har vært utrolig nyttig. takk!
Aah… Det var fordi jeg kalt min listestil annerledes og ikke innse at i ContentQueryMain.xsl ser etter "stil":
<XSL:Når test="@Style='NameOfMyStyle'">
Med det omdøpt arbeidet den. 🙂
Den arbeidet nesten for meg: Jeg klarer å sende den </tabell> sluttkode riktig, men startkoden mangler. Det synes testen = "$CurPos = 1" returnerer ikke sant. Men hvorfor?
Flott innlegg. Paul jeg har gjort alt det ovenfor. Jeg har en spørring, Hvordan kan jeg oppnå summen av "totale faktiske utgifter" eller summen av verdien av to kolonner.
Har du gjort noe arbeid med å opprette egendefinerte ContentQueryMain og ItemStyle xsl-filer? Grunnen til at jeg spør er at jeg ikke ønsker å bekymre seg om min egendefinerte stiler som overskrives oppdateringer eller oppgraderinger. Du har noen eksempler? Jeg har prøvd å lage en identisk kopi av ContentQueryMain.xsl og laste opp nye egendefinerte kopien til stilbiblioteket. Når du legger en referanse til dette xsl-fil i den WebPart MainXslLink eiendom, Jeg får 401 ikke godkjent. Egendefinert xsl-filen er en publisert versjon og alle har lesetilgang til det..
fantastisk innlegg Takk! Har vært kjempet med dette nå de siste dagene.
hei, Dette var en veldig nyttig innlegg. Jeg har det alle arbeider, og også implementert Mike Browns endring så grupperes
resultatene inne uansett hva jeg velger som parameteren Group By i de CQWB egenskaper.
Jeg gjorde tittelen en link også, så det fungerer fint. Jeg har fortsatt ett problem, skjønt. Jeg er gruppere resultatene etter navn. I tabellen, den grupperer dem pent, og det ser bra, men det er fortsatt skrive ut alle gruppen
navn(i mitt tilfelle områdenavnene) over tabellen. Noen does vite hvor å kvitte seg med dette?
takk,
Greg
Fin artikkel. Jeg klarte å gi tabellen utseendet til standard Sharepoint-lister ved å analysere kildekoden til listen. Her er de viktigste HTML blokkene for å passe i ItemStyle:
<Tabellbredde = "100%" class = "ms-listviewtable" border = 0 cellspacing = 0 cellpadding = 1 dir = "Ingen">
<!–TOPPTEKST–>
<TR class = "ms-viewheadertr" VALIGN = OVER>
<TH nowrap omfang = "col" class = "ms-vh2"><div style = "bredde:100%;posisjon:relativ;venstre:0;topp:0;">
<Tabellstil = "bredde:100%;" CtxNum = "1" høyde = "100%" cellspacing = 1 cellpadding 0 class = "ms-unselectedtitle">
<TR>
<TD bredde = "100%" Class = "ms vb" nowrap>
Texte du titer ici
</TD>
<TD style = "posisjon:absolutt;">
</TD>
</TR>
</TABELL></div>
</TH>
<!–Gjenta for alle overskriftscelle–>
</TR>
<!– Tabelldata –>
<TR class = "">
<!–Datakolonnen, bruke Pauls koden for det første med hyperkoblingen –>
<TD Class = "ms-vb2">Her</TD>
<!–Tom kolonne–>
<TD Class = "ms-vb2">
<span dir = ingen></utstrekningen><
/TD>
<!–Datokolonnen–>
<TD Class = "ms-vb2">
<NOBR>11/12/2008</NOBR>
</TD>
</TR>
<!–***Alternativ radfarge – Bruke en ny XSL-variabel som setter inn alternative klassen basert på gjeldende rad modulo 2–>
<TR class = "ms-alternerende">
…
</TR>
</TABELL>
Thatz nettopp jeg var ute etter...Du gynge mann...Lenge leve...Elske deg for innlegget..
<XSL:bruke maler velger = "." Mode = "itemstyle">
<XSL:med param navn = "CurPos" Velg = "$CurPosition" />
<XSL:med param navn = "siste" Velg = "$LastRow" />
<XSL:med param navn = "StartNewGroup" Select="@__begingroup" />
</XSL:når>
<XSL:Når test = "$StartNewGroup ="True ">
<tr>
<TD >
<XSL:samtale-mal name="OuterTemplate.GetGroupName">
<XSL:med param navn = "gruppenavn" Select="@*[navn()= $Group]"/>
<XSL:med param navn = "GroupType" Velg = "$GroupType" />
</XSL:samtale-mal>
</TD>
</tr>
</XSL:når>
<XSL:ellers>
</XSL:ellers>
</XSL:Velg>
Hei Paul,
Når du arbeider med webdelen for xml-xsl og innhold spørring, du har funnet noen gode måter å formatere din xslt? Prøver å gjøre endringer og teste utformingen beviser rett smerte i den en ** bare bruke et tekstredigeringsprogram…
Alt godt
(f.eks. https://myweb.com/Marketing/images/icn-order.gif, )
Bør jeg bruke bilde i felttypen CommonViewFields? (f.eks. InternalColumnName, Bilde)
Innlegget ditt er akkurat hva jeg var ute etter. Men, Jeg skrånende bli den å arbeide.
Jeg har dokumenter som er lagret i ulike doc. biblioteker men klassifiserte bruke en egendefinert klasse-kolonne (valg: 1 eller 2. Jeg vil bruke CQWP til å vise disse dokumentene basert på sin klasse.
Jeg klarte å legge til CQWP, eksportere den til SPD, konfigurere itemStyle.xls for å vise egendefinerte fileds i listevisning. men, Jeg kunne ikke kunne implementere det du beskriver her.
Dette er kolonnene vil jeg vise i min CQWP:
Filtype (vise ikonet)
Filnavn
Siste endringsdato
Endret av som
Utsjekket
Sjekket inn kommentarer
Jeg har for tiden resultatet i listeformat. Hvordan kan jeg endre det til et talble format.
takk.
Saji
Beklager for missspelling på mitt navn ikke sikker på hvor den ” kom fra.