操作方法:如何配合 Project XML 数据交换文件使用 XSLT 转换

可扩展样式表语言转换 (XSLT) 标准指定 XML 数据转换的语言定义。 XSLT 用于将 XML 文档转换为 XHTML 文档或其他 XML 文档。 本文介绍如何将 XSLT 与 Microsoft Office Project 2007 XML 数据交换文件配合使用来筛选和显示项目信息。 (本文的内容由 Microsoft Corporation.)

注意

有关将项目另存为 Project XML 数据交换文件的信息,请参阅 以 XML 格式保存和打开项目

XSLT 样式表是由 XHTML 标记、XSLT 模板规则和协同工作的 XPath 语句的组合组成的 XML 文档。

  • XHTML 标记定义显示 XML 数据的显示环境。

  • XSLT 模板规则提供以特定方式转换源 XML 元素的说明。

  • XPath 语句标识 XML 文档中的特定元素。

当 XML 元素与 XPath 模式匹配时,将调用关联的 XSLT 模板规则。 然后,转换后的数据将呈现在 XHTML 标记指定的显示框架中。

有关 XSLT 模板规则和 XPath 语句的详细信息,请参阅本文末尾的链接。

使用 XSLT 转换显示项目信息

程序 1. 创建 XSLT 样式表:

  1. 为样式表创建 XSLT 文件。 如果在 Microsoft Visual Studio 2005 中工作,则可以在 Visual Studio 中使用 XSLT 文件 模板 (,单击“ 文件”,指向“ 新建”,然后单击“ 文件”。 此模板预填充了以下示例中所示的 XML 代码。 如果使用的是其他文本或 XML 编辑器,请复制此 XML 模板,然后将其粘贴到 XSLT 文件中。

    <?xml version="1.0" encoding="utf-8"?>
    
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:template match="/">
        <html>
        <body>
        <!--
            This is an XSLT template file. Fill in this area with the
            XSL elements which will transform your XML to XHTML.
        -->
        </body>
        </html>
    </xsl:template>
    
    </xsl:stylesheet>
    
  2. 删除以下 XML 代码注释。 这是编写 XSLT 代码的位置。

        <!--
            This is an XSLT template file. Fill in this area with the
            XSL elements that will transform your XML to XHTML.
        -->
    
  3. 创建 XSLT 代码。 此示例中显示的 XSLT 代码执行以下操作:

    • 显示标题中 Project 元素的 Name 子级的文本值。

    • 测试每个 Task 元素的 Summary 子元素,以查看值是否为 0 (false) 。

    • 测试每个 Task 元素的 Critical 子元素,以查看值是否为 1 (true) 。

    • 以粗体显示非摘要任务的关键任务的数据。

    • 显示非摘要任务的非关键任务的数据。

    • 按每个 Resource 元素的 Name 子元素的文本值按字母顺序对资源信息进行排序。

    • 测试每个 Resource 元素的过度分配子元素,以查看该值是否为 1 (true) 。

    • 仅显示过度分配的资源的已排序资源数据。

    <!-- Define a table to display data in. -->
          <table border="1" cellpadding="3">
            <tr>
              <td colspan="5" align="center">
                <!-- Filter for the project name and display it in a header.  -->
                <h2>
                  <font face="tahoma" size="5">
                    Status for: <xsl:value-of select="Project/Name" />
                  </font>
                </h2>
              </td>
            </tr>
            <!-- Define headers for task information. -->
            <tr>
              <td colspan="5" align="center">
                Tasks:
              </td>
            </tr>
            <tr>
              <th>
                <font color="black">ID</font>
              </th>
              <th>
                <font color="black">Name</font>
              </th>
              <th>
                <font color="black">Priority</font>
              </th>
              <th>
                <font color="black">Start</font>
              </th>
              <th>
                <font color="black">Finish</font>
              </th>
            </tr>
            <!-- Filter for tasks -->
            <xsl:for-each select="Project/Tasks/Task">
              <!-- Exclude summary tasks -->
              <xsl:if test="Summary[.=0]">
                <xsl:choose>
                  <!-- Display information for critical tasks with a colored background. -->
                  <xsl:when test="Critical[.=1]">
                    <tr>
                      <td>
                        <xsl:value-of select="ID"/>
                      </td>
                      <td>
                        <b>
                          <xsl:value-of select="Name"/>
                        </b>
                      </td>
                      <td>
                        <b>
                          <xsl:value-of select="Priority"/>
                        </b>
                      </td>
                      <td>
                        <b>
                          <xsl:value-of select="Start"/>
                        </b>
                      </td>
                      <td>
                        <b>
                          <xsl:value-of select="Finish"/>
                        </b>
                      </td>
                    </tr>
                  </xsl:when>
                  <!-- Display information for noncritical tasks with a white background. -->
                  <xsl:otherwise>
                    <tr>
                      <td>
                        <xsl:value-of select="ID"/>
                      </td>
                      <td>
                        <xsl:value-of select="Name"/>
                      </td>
                      <td>
                        <xsl:value-of select="Priority"/>
                      </td>
                      <td>
                        <xsl:value-of select="Start"/>
                      </td>
                      <td>
                        <xsl:value-of select="Finish"/>
                      </td>
                    </tr>
                  </xsl:otherwise>
                </xsl:choose>
              </xsl:if>
            </xsl:for-each>
            <!-- Define headers for overallocated resource information. -->
            <tr>
              <td colspan="5" align="center">
                Overallocated Resources:
              </td>
            </tr>
            <tr>
              <th>
                <font color="black">ID</font>
              </th>
              <th colspan="2">
                <font color="black">Name</font>
              </th>
              <th colspan="2">
                <font color="black">Overtime Rate</font>
              </th>
            </tr>
            <!-- Filter for resources -->
            <xsl:for-each select="Project/Resources/Resource">
              <!-- Sort resources alphabetically by name -->
              <xsl:sort select="Name" />
              <!-- Display information for only resources that are overallocated. -->
              <xsl:if test="OverAllocated[.=1]">
                <tr>
                  <td>
                    <xsl:value-of select="ID"/>
                  </td>
                  <td  colspan="2">
                    <xsl:value-of select="Name"/>
                  </td>
                  <td  colspan="2" align="center">
                    $<xsl:value-of select="OvertimeRate"/>.00
                  </td>
                </tr>
              </xsl:if>
            </xsl:for-each>
          </table>
    
  4. 将文件另存为 ProjectTransform.xslt。

创建 XSLT 样式表后,必须通过添加处理说明将 Project XML 文件链接到它。 过程 2 演示如何将过程 1 中创建的 ProjectTransform.xslt 文件链接到任何 Project XML 文件。

程序 2. 修改 Project XML 文件以使用 XSLT 样式表:

  1. 在 Visual Studio 或其他文本或 XML 编辑器中打开 Project XML 文件。

  2. 在 XML 声明后面插入以下代码行,这是 Project XML 文件中的第一行。

    <?xml-stylesheet type="text/xsl" href="ProjectTransform.xslt"?>
    
  3. 从 Project 元素内部删除 XML 命名空间声明,Project 元素是 Project XML 文件的根元素。 如果不删除嵌入在 Project 元素中的命名空间声明,XPath 语句将无法匹配 Project XML 文件中的元素。

    执行步骤 2 和 3 后,Project XML 文件的前三行应如下面的代码示例所示。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <?xml-stylesheet type="text/xsl" href=" ProjectTransform.xslt"?>
    <Project>
    
  4. 保存 Project XML 文件。

    注意

    建议使用不同于原始 Project XML 文件名的文件名保存文件,因为步骤 3 中所做的更改取消了 Project XML 文件与 Project XML 数据交换架构的关联。

  5. 查看已转换的项目 XML 文件。 可以在 Visual Studio 中执行 XSLT 转换,方法是将 Project XML 文件的 Stylesheet 属性设置为 ProjectTransform.xslt,然后从 XML 菜单中选择“显示 XSLT 输出”。

    还可以在 Internet Explorer 7、Microsoft Office Word 2007 或任何其他支持 XSLT 的应用程序中打开 Project XML 文件。

图 1 显示了 Word 2007 中 Project XML 文件的转换输出。 打开 Project XML 文件时,默认显示 “仅数据” 数据视图。 若要查看转换后的输出,必须在“XML 文档”窗格中选择 ProjectTransform.xslt 数据视图。

图 1. 已转换的项目 XML 文件

已转换的项目 XML 文件

另请参阅