xsl计数和xpath语法

时间:2016-06-03 13:14:09

标签: xslt sharepoint xpath

我有一个在SharePoint 2010中创建的项目表。我正在尝试为管理创建报告,并且需要获取各个字段的计数。我在查看单个项目时使用xsl来获取字段的值,所以我对语言非常熟悉。但是,我找不到计算多个项目的语法的好解释。

我有一张这样的表:

<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>

有很多嵌套正在进行,因此我难以定位特定区域,而且由于这是由SharePoint生成的,因此我几乎无法控制html。

以下是我尝试使用XSL创建的报告表:

<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>

我知道我的XPATH语法存在问题,但我无法理解。

2 个答案:

答案 0 :(得分:1)

而不是:

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

尝试:

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

同样适用于其他两个。

备注

  • 您没有提供上下文,因此我将路径更改为绝对路径,该路径计算整个文档中的所有节点;

  • 您没有名为ms-vb2;

  • 的属性
  • 在比较没有空格的字符串之前,您需要修剪数据单元格中的空格。

以下样式表:

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>

应用于您的输入示例,将返回:

<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 :(得分:1)

完整的XSLT看起来像这样:

<?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>

您可以使用

将其包含在源XML文件中
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="source.xslt"?>
在您的XML文件中

以获得格式良好的HTML输出。

输出如下所示:

enter image description here