2016-06-03 4 views
0

Ich habe eine Tabelle von Projekten in SharePoint 2010 erstellt. Ich versuche, Berichte für die Verwaltung zu erstellen und müssen die Anzahl der verschiedenen Felder erhalten. Ich habe xsl verwendet, um die Werte von Feldern zu erhalten, wenn ich einzelne Elemente anschaue, also bin ich ziemlich vertraut mit der Sprache. Ich kann jedoch keine gute Erklärung für die Syntax zum Zählen mehrerer Elemente finden.xsl Zählen und Xpath-Syntax

Ich habe eine Tabelle wie folgt aus:

<table> 
    <tr> 
    <th class="ms-vb2"> 
     Project Title 
    </th> 
    <th class="ms-vb2"> 
     Project Leader 
    </th> 
    <th class="ms-vb2"> 
     Project Status 
    </th> 
    </tr> 
    <tr> 
    <td class="ms-vb2"> 
     Project Title 1 
    </td> 
    <td class="ms-vb2"> 
     Project Leader 1 
    </td> 
    <td class="ms-vb2"> 
     Completed 
    </td> 
    </tr> 
    <tr> 
    <td class="ms-vb2"> 
     Project Title 2 
    </td> 
    <td class="ms-vb2"> 
     Project Leader 1 
    </td> 
    <td class="ms-vb2"> 
     Withdrawn 
    </td> 
    </tr> 
    <tr> 
    <td class="ms-vb2"> 
     Project Title 3 
    </td> 
    <td class="ms-vb2"> 
     Project Leader 2 
    </td> 
    <td class="ms-vb2"> 
     Completed 
    </td> 
    </tr> 
    <!--About 100 more rows--> 
</table> 

Es gibt eine Menge von Verschachtelung los, so dass ich habe Schwierigkeiten bestimmte Bereiche gezielt und ich habe sehr wenig Kontrolle über den HTML-Code aufgrund dieser durch erzeugt wird SharePoint. Hier

ist die Berichtstabelle I mit XSL zu schaffen versuchen:

<table id="FourBlockerHead" class="ClearBlockFloat"> 
    <tr> 
    <th>Completed Count</th> 
    <th>Withdrawn Count</th> 
    <th>On Hold Count</th> 
    </tr> 
    <tr> 
    <td> 
     <xsl:value-of select="count(../td[@ms-vb2='Completed'])" /><!--Should be 2--> 
    </td> 
    <td> 
     <xsl:value-of select="count(../td[@ms-vb2='Withdrawn'])" /><!--Should be 1--> 
    </td> 
    <td> 
     <xsl:value-of select="count(../td[@ms-vb2='On Hold'])" /><!--Should be 0--> 
    </td> 
    </tr> 
</table> 

Ich weiß, es ist ein Problem mit meiner XPath-Syntax, aber ich kann es nicht herausgefunden.

+0

Können Sie eine Kopie von dem, was die Quelle XML aussieht? Oder versuchen Sie, HTML als XML zu verarbeiten und XSL darauf anzuwenden? – Stevangelista

+0

@Ryan Sie nicht in eckigen Klammern schließen – splash58

+0

@Stevangelista Das könnte tatsächlich mein Problem sein. Können Sie XSL nicht auf HTML anwenden? Ich habe eine andere Seite, die auf bestimmte Felder (im selben SharePoint) zugreift und sie zu einer schönen Präsentationsseite formatiert. Also dachte ich mir, dass ich XSL auch so verwenden könnte. Mein langfristiger Plan besteht darin, diese "Zählungen" in Kombination mit anderen zu verwenden, um Balken- und Diagrammdiagramme mit JavaScript zu erstellen. – Ryan

Antwort

1

Statt:

<xsl:value-of select="count(../td[@ms-vb2='Completed')" /> 

Versuch:

<xsl:value-of select="count(//td[@class='ms-vb2'][normalize-space()='Completed'])" /> 

und ebenfalls für die anderen beiden.

Hinweise:

  • Sie nicht den Kontext lieferten, so habe ich den Pfad zu einem absoluten einen geändert, dass alle Knoten im gesamten Dokument zählt;

  • Sie haben kein Attribut mit dem Namen ms-vb2;

  • Sie müssen den Leerraum in der Datenzelle vor dem Vergleich mit einer Zeichenfolge ohne Leerzeichen leeren.


Das folgende Stylesheet:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="table"> 
    <table id="FourBlockerHead" class="ClearBlockFloat"> 
     <tr> 
      <th>Completed Count</th> 
      <th>Withdrawn Count</th> 
      <th>On Hold Count</th> 
     </tr> 
     <tr> 
      <td> 
       <xsl:value-of select="count(//td[@class='ms-vb2'][normalize-space()='Completed'])" /> 
      </td> 
      <td> 
       <xsl:value-of select="count(//td[@class='ms-vb2'][normalize-space()='Withdrawn'])" /> 
      </td> 
      <td> 
       <xsl:value-of select="count(//td[@class='ms-vb2'][normalize-space()='On Hold'])" /> 
      </td> 
     </tr> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

auf Ihre Eingabe Beispiel angewendet wird, zurück:

<table id="FourBlockerHead" class="ClearBlockFloat"> 
    <tr> 
     <th>Completed Count</th> 
     <th>Withdrawn Count</th> 
     <th>On Hold Count</th> 
    </tr> 
    <tr> 
     <td>2</td> 
     <td>1</td> 
     <td>0</td> 
    </tr> 
</table> 
1

Eine vollständige XSLT würde wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes" /> 

    <xsl:template match="/table"> 
    <html> 
     <body> 
     <table id="FourBlockerHead" class="ClearBlockFloat" border="1"> 
      <tr> 
      <th>Completed Count</th> 
      <th>Withdrawn Count</th> 
      <th>On Hold Count</th> 
      </tr> 
      <xsl:for-each select="tr"> 
      <tr> 
      <td> 
       <xsl:value-of select="count(td[@class='ms-vb2' and normalize-space(text())='Completed'])" /><!--Should be 2--> 
      </td> 
      <td> 
       <xsl:value-of select="count(td[@class='ms-vb2' and normalize-space(text())='Withdrawn'])" /><!--Should be 1--> 
      </td> 
      <td> 
       <xsl:value-of select="count(td[@class='ms-vb2' and normalize-space(text())='On Hold'])" /><!--Should be 0--> 
      </td> 
      </tr> 
      </xsl:for-each> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

</xsl:stylesheet> 

Sie diese XML-Datei in Ihrer Quelle mit

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="source.xslt"?> 

in der XML-Datei, die eine gut formatierte HTML-Ausgabe zu erhalten enthalten kann.

Die Ausgabe würde wie folgt aussehen:

enter image description here