我是一名c#程序员,但我从未需要使用XSLT。我现在这样做,我被困住了
考虑到一些xml,我需要使用XSLT来生成一个html输出。稍微有点想法,我设法将一些东西放在一起,直到我的老板告诉我“表和列必须动态构建到xslt文档中。我正在硬编码列名称。 所有列标题必须是水平的。
编写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>
答案 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;在你想要的表格输出中 - 所以它不清楚为什么在标题中提到它。