Overzicht en doelstelling
Out of the box, MOSS’ Webonderdeel Inhoudsquery (CQWP) de resultaten worden in een lijstindeling weergegeven, vergelijkbaar met zoekresultaten. Het is ook mogelijk om de resultaten in een grid-formaat weergeven (dwz. HTML-tabelindeling). Raster formaten zijn beter in bepaalde omstandigheden. Beschrijf ik hoe om te bereiken dat effect in dit artikel.
Bedrijfsscenario
Ik heb gewerkt met een cliënt op de uitrol van een ondernemingsbreed MOSS. Wij hebben hun taxonomie ontworpen zodanig dat projecten eerste klassenburgers in de hiërarchie zijn en hun eigen site van het hoogste niveau hebben. Projectmanagers handhaven een singleton lijst van projectsamenvattingsgegevens, zoals de titel van, begroting, verwachte Voltooiingsdatum, resterende begroting en andere velden resumétype. Door "singleton" Ik bedoel een aangepaste SharePoint-lijst gegarandeerd bevatten slechts één item. Simplistisch, het ziet er als volgt:
De technische aanpak is veel hetzelfde als beschreven Hier (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). De CQWP maakt gebruik van een XSL-transformatie voor het uitzenden van HTML voor de browser weer te geven.
Ik altijd het resultaat voordat duiken in de XSL omdat XSL een nachtmerrie is voor ogen. Hier is mijn gewenste resultaat:
HTML als dit genereert dat resultaat:
<HTML> <lichaam> <Center> <tabel grens= 1> <!-- Etiketten--> <tr bgcolor= blauw> <TD><lettertype Kleur= wit><b>Naam van het project</b></lettertype></TD> <TD uitlijnen= rechts><lettertype Kleur= wit><b>Datum voltooid</b></lettertype></TD> <TD uitlijnen= rechts><lettertype Kleur= wit><b>Begroting</b></lettertype></TD> <TD uitlijnen= rechts><lettertype Kleur= wit><b>Werkelijke kosten</b></lettertype></TD> <TD><lettertype Kleur= wit><b>Algemene Status</b></lettertype></TD> </tr> <tr> <TD>Boren computerlokaal.</TD> <TD uitlijnen= rechts>02/01/08</TD> <TD uitlijnen= rechts>22,500.00</TD> <TD uitlijnen= rechts>19,000.00</TD> <TD>In uitvoering</TD> </tr> <tr> <TD>Bepaling servers voor SQL Upgrade</TD> <TD uitlijnen= rechts>04/01/08</TD> <TD uitlijnen= rechts>7,500.00</TD> <TD uitlijnen= rechts>0.00</TD> <TD>Gepland</TD> </tr> </tabel> </Center> </lichaam> </HTML> |
Aanpak
Als volgt te werk als u wilt maken het raster:
- Identificatie van de bestanddelen van het raster (rijen en kolommen).
- Definiëren en maken noodzakelijk sitekolommen.
- Maak sub sites voor de projecten en het singleton lijsten.
- De CQWP aan een webpagina toevoegen en configureren om te zoeken naar uw lijsten.
- De CQWP van XML naar het verzamelen van de aanvullende kolommen wijzigen.
- De XSL voor het genereren van een tabel wijzigen.
I 'm gonna concentreren op nummer zes. Getallen tot en met 4 zijn rechttoe-rechtaan en iets dat elke gebruiker CQWP heeft al gedaan. Nummer vijf is goed gedocumenteerd door anderen met inbegrip van dit volledig scherm-schot beladen artikel van MSDN Hier (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) en Heather Solomon's blog Hier (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Moeren en bouten
Beginnen en uit te voeren stappen 1 tot en met 5 vanaf de MSDN-documentatie en Heather Solomon artikel.
Op dit punt, u kunt uw CQWP aan de pagina hebt toegevoegd en u hebt uw <CommonViewFields> zo nodig geconfigureerd.
De gebruikelijke stappen uit te voeren, Ik krijg deze tussentijdse resultaten:
1. Een inhoudstype maken, een templatized aangepaste lijst voor dat inhoudstype en twee sites. Hier wordt het type inhoud:
Hier is de structuur van de site:
2. De CQWP na het maken van mijn project subsites en het singleton project samenvatting lijsten toevoegen:
3. Voeg de aanvullende informatie die ik wil via de <CommonViewFields>:
<eigenschap naam="CommonViewFields" type="tekenreeks">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</eigenschap>
Merk op dat ik moest houden de eigenschapsvelden op één lijn of het zou niet werken (CQWP zou vertellen me dat de query heeft geen resultaten opgeleverd).
4. Op dit punt, we klaar om te gaan dan het MSDN-artikel en tik op over Heather Solomon's artikel. Haar stappen beginnen in de buurt van stap #5 een aangepaste maken / unghosted versie van ItemStyle.xsl. Ik volg Heather's advies, door stap omhoog 11 en krijg deze tussentijdse resultaten:
4.1: Mijn XSL-sjabloon als volgt de naam:
<XSL:Sjabloonnaam = "Grid" overeenkomen met = "rij[@Style = 'Raster']" modus = "itemstyle">
Ik wijzigen ook iets haar voorgesteld <XSL:for-each …> door het toevoegen van een <BR /> label voor een schonere:
<XSL:for-each Selecteer="@*"> P:<XSL:waarde-van Selecteer="naam()" /><BR/> </XSL:for-each>
4.2: Ik wijzigen het webonderdeel, Ga naar uiterlijk en selecteer mijn "Grid" stijl:
De wijziging door te voeren en hier is het resultaat:
Uit het bovenstaande kunnen we zien dat de velden die we willen (Naam van het project, kosten, status, etc) beschikbaar zijn voor ons om te gebruiken wanneer we de HTML-code uitstoten. Niet alleen dat, maar we zien de namen waaraan we moeten verwijzen naar die kolommen in de XSL. Bijvoorbeeld, We verwijzen naar de statusdatum van het Project als "Project_x005F_x0020_Name".
Op dit punt, We vertrekken van Heather's blog en van de schouders van deze reuzen, Ik voeg mijn eigen beetje.
ContentQueryMain.xsl
OPMERKING: Wanneer u wijzigingen aanbrengt aan zowel ContentQueryMain.xsl als ItemStyle.xsl, u moet controleren dat deze bestanden terug in voordat u het effect van uw wijzigingen zien.
Voor doeleinden van het raster maken, MOSS maakt gebruik van twee verschillende XSL-bestanden voor de productie van de resultaten die we van een CQWP zien. Voor het genereren van de vorige bit van output, We bewerkt ItemStyle.xsl. MOSS daadwerkelijk gebruik maakt van een andere XSL-bestand, ContentQueryMain.xsl om in combinatie met ItemStyle.xsl voor het genereren van de HTML-code. Zoals de naam al impliceert, ContentQueryMain.xsl is de belangrijkste"" XSL waarmee de totale stroom van vertaling. Het doorlopen van alle gevonden items en geeft ze één voor één aan sjablonen in ItemStyle.xsl. We zullen wijzigen ItemStyle.xsl voor het genereren van de open <tabel> Label vóór dat de eerste rij van de gegevens en de afronding <tabel> Label na de laatste rij uitstoten. Om dit te bereiken, ContentQueryMain.xsl is aangepast om twee parameters doorgeven aan onze "grid" sjabloon in ItemStyle.xsl, "laatste rij" en "huidige rij". ItemStyle.xsl maakt gebruik van deze voorwaardelijk uitstoten de nodige codes.
Met behulp van Heather Solomon techniek, Wij zoeken ContentQueryMain.xsl. Het is gelegen in de dezelfde plaats als ItemStyle.xsl. Dit schermschot moet helpen:
We moeten de volgende wijzigingen aanbrengen:
- Een XSL-sjabloon wijzigen, "CallItemTemplate" dat roept eigenlijk onze raster sjabloon in ItemStyle.xsl. We zullen twee parameters doorgeven aan de Grid-sjabloon, zodat het de vereiste gegevens hebben zal voor het genereren van voorwaardelijk openen en sluiten <tabel> Tags.
- Een ander stukje van ContentQueryMain.xsl waarin de "CallItemTemplate wijzigen" geschiedde het een "LastRow" met de parameter dus dat LastRow kan worden doorgegeven aan onze raster sjabloon.
Zoek de sjabloon met de naam "OuterTemplate.CallItemTemplate" geïdentificeerd door de tekenreeks:
<XSL:sjabloon naam="OuterTemplate.CallItemTemplate">
De hele sjabloon als volgt vervangen:
<XSL:sjabloon naam="OuterTemplate.CallItemTemplate"> <XSL:param naam="CurPosition" /> <!-- De "LastRow toevoegen" met de parameter. We alleen gebruiken wanneer het item stijl pass in zich "Grid". --> <XSL:param naam="LastRow" /> <XSL:Kies> <XSL:Wanneer test="@Style = 'NewsRollUpItem'"> <XSL:apply-templates Selecteer="." modus="itemstyle"> <XSL:met-param naam="EditMode" Selecteer="$cbq_iseditmode" /> </XSL:apply-templates> </XSL:Wanneer> <XSL:Wanneer test="@Style = 'NewsBigItem'"> <XSL:apply-templates Selecteer="." modus="itemstyle"> <XSL:met-param naam="CurPos" Selecteer="$CurPosition" /> </XSL:apply-templates> </XSL:Wanneer> <XSL:Wanneer test="@Style = 'NewsCategoryItem'"> <XSL:apply-templates Selecteer="." modus="itemstyle"> <XSL:met-param naam="CurPos" Selecteer="$CurPosition" /> </XSL:apply-templates> </XSL:Wanneer> <!-- Huidige positie en lastrow doorgeven aan de Grid itemstyle.xsl sjabloon. ItemStyle.xsl gebruik dat het uitzenden van de open en sluiten <tabel> Tags. --> <XSL:Wanneer test="@Style = 'Raster'"> <XSL:apply-templates Selecteer="." modus="itemstyle"> <XSL:met-param naam="CurPos" Selecteer="$CurPosition" /> <XSL:met-param naam="Laatste" Selecteer="$LastRow" /> </XSL:apply-templates> </XSL:Wanneer> <XSL:anders> <XSL:apply-templates Selecteer="." modus="itemstyle"> </XSL:apply-templates> </XSL:anders> </XSL:Kies> </XSL:sjabloon> |
De opmerkingen beschrijving van het doel van de wijzigingen.
Natuurlijk, de OuterTemplate.CallItemTemplate"" zelf wordt aangeroepen vanuit een andere sjabloon. Die sjabloon vinden door te zoeken naar deze tekenreeks:
<XSL:sjabloon naam="OuterTemplate.Body">
Blader door de instructies in OuterTemplate.Body en de parameter LastRow bijvoegen (weergegeven als een commentaar in cursief):
<XSL:oproep-sjabloon naam="OuterTemplate.CallItemTemplate"> <XSL:met-param naam="CurPosition" Selecteer="$CurPosition" /> <!-- De LastRow parameter invoegen. --> <XSL:met-param naam="LastRow" Selecteer="$LastRow"/> </XSL:oproep-sjabloon>
Na dit alles, We hebben eindelijk dingen correct ingesteld zodat onze ItemStyle.xsl kunnen uitstoten <tabel> Tags op de juiste plaats.
ItemStyle.Xsl
OPMERKING: Weer, check in ItemStyle.xsl na wijzigingen zodat u het effect van die wijzigingen zien.
We hebben hier twee taken:
- Vervang de gehele Grid-sjabloon. U kunt kopiëren/plakken uit de onderstaande lijst.
- Sommige mumbo jumbo buiten de definitie van de sjabloon waarmee "formatcurrency toevoegen" sjabloon om te werken. (U kunt vertellen dat ik heb een ijle greep op XSL).
Eerste, in de buurt van de top van ItemStyle.xsl, Voeg deze regel toe:
<!-- Sommige mumbo jumbo waarmee we kunnen U.S weergeven. valuta. --> <XSL:decimaal-formaat naam="personeel" cijfers="D" /> <XSL:sjabloon naam="Standaard" wedstrijd="*" modus="itemstyle">
Opmerking dat ik toegevoegd het direct vóór de <XSL:Sjabloonnaam = "standaard" …> definitie.
Volgende, Ga terug naar onze raster sjabloon. De gehele Grid sjabloon vervangen door de onderstaande code. Het is grondig toegelicht, maar aarzel dan niet om me e-mail of reacties op mijn blog als u vragen hebt.
<XSL:sjabloon naam="Raster" wedstrijd="Rij[@Style = 'Raster']" modus="itemstyle"> <!-- ContentMain.xsl gaat CurPos en laatste. We deze gebruiken om voorwaardelijk uitstoten het openen en sluiten <tabel> Tags. --> <XSL:param naam="CurPos" /> <XSL:param naam="Laatste" /> <!-- De volgende variabelen zijn tussentijds niet zijn gewijzigd van de standaard ItemStyle.xsl --> <XSL:variabele naam="SafeImageUrl"> <XSL:oproep-sjabloon naam="OuterTemplate.GetSafeStaticUrl"> <XSL:met-param naam="UrlColumnName" Selecteer="'ImageUrl'"/> </XSL:oproep-sjabloon> </XSL:variabele> <XSL:variabele naam="SafeLinkUrl"> <XSL:oproep-sjabloon naam="OuterTemplate.GetSafeLink"> <XSL:met-param naam="UrlColumnName" Selecteer="'LinkUrl'"/> </XSL:oproep-sjabloon> </XSL:variabele> <XSL:variabele naam="DisplayTitle"> <XSL:oproep-sjabloon naam="OuterTemplate.GetTitle"> <XSL:met-param naam="Titel" Selecteer="@Title"/> <XSL:met-param naam="UrlColumnName" Selecteer="'LinkUrl'"/> </XSL:oproep-sjabloon> </XSL:variabele> <XSL:variabele naam="LinkTarget"> <XSL:Als test="@OpenInNewWindow = 'True'" >_blank</XSL:Als> </XSL:variabele> <!-- Hier definiëren we een variabele, "tableStart". Dit bevat de HTML-code die we gebruiken om te definiëren van de opening van de tabel, alsmede de kolomlabels. Merk op dat als CurPos = 1, het bevat de HTML-code in een CDATA-tag. Anders, het is leeg. De waarde van tableStart is emited telkens wanneer ItemStyle wordt aangeroepen via ContentQueryMain.xsl. --> <XSL:variabele naam="tableStart"> <XSL:Als test="$CurPos = 1"> <![CDATA[ <tabelrand = 1> <TR bgcolor = "blauw"> <TD><tekstkleur = "wit"><b>Naam van het project</b></lettertype></TD> <TD align = "rechts"><tekstkleur = "wit"><b>Datum voltooid</b></lettertype></TD> <TD align = "rechts"><tekstkleur = "wit"><b>Begroting</b></lettertype></TD> <TD align = "rechts"><tekstkleur = "wit"><b>Werkelijke kosten</b></lettertype></TD> <TD><tekstkleur = "wit"><b>Algemene Status</b></lettertype></TD> </tr> ]]> </XSL:Als> </XSL:variabele> <!-- Een andere variabele, tableEnd gewoon definieert de afsluitende tag tabel. Zoals met tableStart, het is altijd emited. Dit is de reden waarom de waarde is toegewezen voorwaardelijk op basis van de vraag of we de laatste rij met ContentQueryMain.xsl heb zijn aangenomen. --> <XSL:variabele naam="tableEnd"> <XSL:Als test="$CurPos = $Last"> <![CDATA[ </tabel> ]]> </XSL:Als> </XSL:variabele> <!-- Altijd het uitzenden van de inhoud van tableStart. Als dit niet de eerste rij doorgegeven aan ons door ContentQueryMain.xsl, dan weten we de waarde leeg zal worden. Uitschakelen uitvoer ontsnappen omdat wanneer tableStart het niet leeg, Het omvat werkelijke HTML die we willen worden weergegeven door de browser. Als we niet vertellen uitvoer de XSL-parser uitschakelen ontsnappen, zal het genereren van dingen zoals"<tabel>" in plaats van"<tabel>". --> <XSL:waarde-van Selecteer="$tableStart" uitschakelen-uitvoer-ontsnappen="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:waarde-van Selecteer="@Project_x005F_x0020_Name"/> </TD> <TD uitlijnen="recht"> <XSL:waarde-van Selecteer="@Project_x005F_x0020_End_x005F_x0020_Date"/> </TD> <TD uitlijnen="recht"> <XSL:oproep-sjabloon naam="FormatCurrency"> <XSL:met-param naam="waarde" |
Dit is ongelooflijk nuttig geweest. Bedankt!
Aah… het was omdat ik een andere naam hebben mijn stijl lijst en wist niet dat dat in de ContentQueryMain.xsl gecontroleerd op de "stijl":
<XSL:Wanneer test="@Style='NameOfMyStyle'">
Met die omgedoopt tot werkte het. 🙂
Het bijna werkte voor mij: Ik beheren voor de uitvoer van de </tabel> Label correct beëindigen, maar de eerste tag ontbreekt. Het lijkt de test = "$CurPos = 1" geeft geen resultaat waar. Maar waarom?
Grote Post. Paul heb ik de bovenstaande dingen gedaan. Ik heb een query, Hoe kan ik bereiken de som van "totale werkelijke Expences" of de som van de waarde van twee kolommen.
Heb je gedaan geen werk met het maken van aangepaste XSL-bestanden ContentQueryMain en ItemStyle? De reden dat ik vraag is dat ik niet willen zorgen te maken over mijn aangepaste opmaakprofielen worden overschreven met alle patches of upgrades. Heb je voorbeelden? Ik heb geprobeerd een identieke kopie van de ContentQueryMain.xsl maken en uploaden van die nieuwe aangepaste kopie naar de stijlbibliotheek. Bij de samenstelling van een verwijzing naar dit XSL-bestand in de .webpart MainXslLink eigenschap, Ik krijg 401 niet toegestaan. Het aangepaste XSL-bestand is een gepubliceerde versie en iedereen heeft leestoegang tot het.
fantastische post Bedankt! Hebben te kampen met dit nu voor de laatste paar dagen.
Hallo, Dit was een echt nuttig boeken. Ik heb het alle werken, en ook geïmplementeerd Mike Brown wijzigen zodat het groepen
de resultaten in de tabel door wat ik kiezen als de parameter Group By in de CQWB eigenschappen.
Ik legde een verband ook de titel, dus het werkt mooi. Ik heb nog steeds een probleem, Hoewel. Ik ben de resultaten groeperen op naam van de site. In de tabel, Het groepeert ze mooi, en het ziet er geweldig, maar het is nog steeds afdrukken uit de groep
namen(in mijn geval de sitenamen) boven de tabel. Weet iemand hoe om zich te ontdoen van deze?
Bedankt,
Greg
Leuk artikel. Ik erin geslaagd om mijn tabel geven het uiterlijk van de standaard Sharepoint-lijsten door het analyseren van de broncode van de lijst. Hier zijn de belangrijkste HTML-blokken die nodig zijn om te passen in ItemStyle:
<Tabelbreedte = "100%" klasse = "ms-listviewtable" border = 0 cellspacing = 0 cellpadding = 1 dir = 'Geen'>
<!–KOPTEKST–>
<Klasse TR = "ms-viewheadertr" VALIGN = BOVEN>
<TH nowrap toepassingsgebied = "col" klasse = "ms-vh2"><div-style = "width:100%;positie:relatieve;links:0;Boven:0;">
<TABLE style = "width:100%;" CtxNum = "1" hoogte = "100%" Cellspacing = 1 cellpadding = 0 class = "ms-unselectedtitle">
<TR>
<TD breedte = "100%" Klasse = 'ms vb" NoWrap>
Texte du titre ici
</TD>
<TD stijl = "positie:absolute;">
</TD>
</TR>
</TABEL></div>
</TH>
<!–Herhaal voor alle cellen met koptekst–>
</TR>
<!– Gegevens in een tabel –>
<Klasse TR = "">
<!–Gegevenskolom, Paul's code gebruiken met de hyperlink voor de eerste –>
<TD Class = "ms-vb2">Gegevens hier</TD>
<!–Lege kolom–>
<TD Class = "ms-vb2">
<span dir = None></span><
/TD>
<!–Datumkolom–>
<TD Class = "ms-vb2">
<NOBR>11/12/2008</NOBR>
</TD>
</TR>
<!–***Plaatsvervanger rij – Gebruik een nieuwe variabele van XSL waarmee de alternatieve klasse op basis van de huidige rij modulo 2 wordt ingevoegd–>
<Klasse TR = "ms-afwisselend">
…
</TR>
</TABEL>
Thatz juist was ik op zoek naar...You rock man...Lang leve...Hou van je voor de post..
<XSL:apply-templates Selecteer = "." modus = "itemstyle">
<XSL:met param name = "CurPos" Selecteer "$CurPosition =" />
<XSL:met param name = "laatste" Selecteer "$LastRow =" />
<XSL:met param name = "StartNewGroup" Select="@__begingroup" />
</XSL:Wanneer>
<XSL:Wanneer test = "$StartNewGroup ="True"">
<tr>
<TD >
<XSL:oproep-template name="OuterTemplate.GetGroupName">
<XSL:met param name = "GroupName" Select="@*[naam()= $Group]"/>
<XSL:met param name = "GroupType" Selecteer "$GroupType" = />
</XSL:oproep-sjabloon>
</TD>
</tr>
</XSL:Wanneer>
<XSL:anders>
</XSL:anders>
</XSL:Kies>
Hallo Paul,
Bij het werken met het webonderdeel Inhoudsquery xml/xsl en inhoud, heb je gevonden een goede manieren om uw xslt opmaken? Proberen wijzigingen aanbrengen en de testopzet blijkt een juiste pijn in de een ** alleen met behulp van een teksteditor…
De beste
(bijvoorbeeld. https://myweb.com/Marketing/images/icn-order.gif, )
Moet ik afbeelding of figuur gebruiken in het CommonViewFields veldtype? (bijvoorbeeld. InternalColumnName, Afbeelding)
Uw bericht is precies wat ik zocht. Echter, Ik kan niet krijgen om te werken.
Ik heb documenten die zijn opgeslagen in verschillende doc. bibliotheken maar ingedeeld aan de hand van een aangepaste klasse kolom (keuze: 1 of 2. Ik wil CQWP gebruiken om deze documenten op basis van hun klasse weergeven.
Ik was in staat om toe te voegen van de CQWP, exporteren naar SPD, de itemStyle.xls als u wilt aangepaste velden weergeven in lijstweergave configureren. echter, Ik kon niet met succes uitvoeren wat je hier beschrijft.
Dit zijn de kolommen die ik wil laten zien in mijn CQWP:
Bestandstype (pictogram weergeven)
File Title
Datum laatst gewijzigd
Gewijzigd door die
Uitgecheckt om te
Gecontroleerd In commentaren
Ik heb momenteel het resultaat in een lijstindeling. Hoe wijzig ik het naar een talble formaat.
Bedankt.
Durag
Sorry voor de missspelling in mijn naam niet zeker waar de ” kwam uit.