如何分组结果

时间:2014-12-22 07:51:52

标签: c# xml xslt

我是一名c#程序员,但我从未需要使用XSLT。我现在这样做,我被困住了

考虑到一些xml,我需要使用XSLT来生成一个html输出。稍微有点想法,我设法将一些东西放在一起,直到我的老板告诉我“表和列必须动态构建到xslt文档中。我正在硬编码列名称。 所有列标题必须是水平的。

Sample output

编写xslt的任何帮助?我做的那个没用,因为它硬编码了列

EDITED

<Generated>
  <Employees>
    <Employee name="Joe Bloggs">
      <Sales>
        <Sale key="Sale-Id" value="2323" />
        <Sale key="Sale-Field1" value="Field1sale" />
        <Sale key="Sale-Field2" value="field2Sale" />
       </Sales>
     </Employee>
      <Employee name="Mark Bloggs">
      <Sales>
        <Sale key="Sale-Id" value="334" />
        <Sale key="Sale-Field1" value="Field1sale" />
        <Sale key="Sale-Field2" value="field2Sale" />
       </Sales>
     </Employee>
  </Employees>
  <Products>
    <Product name="Rice">
      <Sales>
        <Sale key="Sale-Id" value="334" />
        <Sale key="Sale-Field1" value="Field1sale" />
        <Sale key="Sale-Field2" value="field2Sale" />
       </Sales>
     </Product>
      <Product name="Wine">
          <Sales>
            <Sale key="Sale-Id" value="32" />
            <Sale key="Sale-Field1" value="Field1sale" />
            <Sale key="Sale-Field2" value="field2Sale" />
           </Sales>
     </Product>
  </Products>
</Generated>

我知道错误但是学习XSLT

        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
          <xsl:template match="/">
            <xsl:for-each select="(Generated/Employees/Employee)[1]/Sales/Sale[@key != 'Sale-Id']">
              <xsl:for-each select="Generated/Employees/Employee">
              </xsl:for-each>
              <xsl:for-each select="./Sales/Sale[@key != 'Sale-Id']">
              </xsl:for-each>
              <xsl:value-of select="@Value"/>
            </xsl:for-each>
          </xsl:template>
        </xsl:stylesheet>

2 个答案:

答案 0 :(得分:3)

对于标题行,使用@key值为第一个记录的每个字段创建一个单元格。对于正文,为每个记录创建一行,然后为每个字段创建一个单元格,这次使用@value值。

这假设每条记录具有完全相同的字段列表。使用谓词以从列表中排除某些字段 - 例如您的示例中的Sale-Id。

我不知道这与分组有什么关系。

答案 1 :(得分:2)

好吧,假设您的列Sale-Field1等对于所有Employees都是相同的,并且可以从第一个员工记录中获取(它不是真的 - 那么任务就更难了) - 基本上您只需<xsl:for-each><xsl:value-of>

第二个要求 - 您基本上应该理解xpath个查询,因为它用于从xml中检索数据。

因此,要创建标题,您可以使用:

<xsl:for-each select="(Generated/Employees/Employee)[1]/Sales/Sale[@key != 'Sale-Id']">

这将迭代Sale节点的Employee个节点,其属性key不等于Sale-Id(因为您在表格中不需要这个) 。在该迭代中,您可以将属性value设为<xsl:value-of select="@key" />

这些都是标题,让我们去行。您可以像以前一样迭代员工:

<xsl:for-each select="Generated/Employees/Employee">

现在,在您将员工的姓名称为<xsl:value-of select="@name" />之后,您还需要一个嵌套的循环 - 超过销售额:

<xsl:for-each select="./Sales/Sale[@key != 'Sale-Id']">

请注意,我们使用以./开头的相对xpath。最后,在该循环中,您可以将值设为<xsl:value-of select="@value" />

是的 - 我看不到任何&#34;分组&#34;在你想要的表格输出中 - 所以它不清楚为什么在标题中提到它。