- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何将 SUM() 函数应用于每个 hours
节点?我将把这个转换后的 XML 保存为 Excel,我希望它嵌入 SUM() 函数。经过研究,似乎有很多方法可以做到这一点,但没有一个真正适用于我的问题。
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<img src="../images/company_logo.png"></img>
<p>Company: <xsl:value-of select="companies/company[1]/companyName"/></p>
<p>Date: <xsl:value-of select="companies/company[1]/startDate"/> to <xsl:value-of select="companies/row[last()]/endDate"/></p>
<table>
<xsl:for-each select="company/row">
<tr>
<td>ID:</td>
<td><xsl:value-of select="serviceID"/></td>
<td>Hours:</td>
<td><xsl:value-of select="hours"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XML
<company>
<companyName>Cool Beans</companyName>
<serviceID>1</serviceID>
<startDate>01-01-2014 00:00:00</startDate>
<endDate>01-02-2014 00:00:00</endDate>
<hours>2</hours>
</company>
最佳答案
假设您有一个像这样的文件:
<companies name="My Companies">
<company>
<companyName>Cool Beans</companyName>
<serviceID>1</serviceID>
<startDate>01-01-2014 00:00:00</startDate>
<endDate>01-02-2014 00:00:00</endDate>
<hours>2</hours>
</company>
<company>
<companyName>Hot Beans</companyName>
<serviceID>2</serviceID>
<startDate>01-01-2014 00:00:00</startDate>
<endDate>01-02-2014 00:00:00</endDate>
<hours>2</hours>
</company>
<company>
<companyName>Evil Beans</companyName>
<serviceID>3</serviceID>
<startDate>01-03-2014 00:00:00</startDate>
<endDate>01-04-2014 00:00:00</endDate>
<hours>2</hours>
</company>
</companies>
您必须生成有效的 XLS 或 XSLX 文件。我将使用 [此 Office 2003] ( http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats ) 格式作为示例 (XLS)。
您的样式表必须声明您可能需要的所有前缀和命名空间,以保证电子表格中的属性和元素的质量。您只需在 XSLT 中声明它们,它们就会被复制到您的结果文件中:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"> ... </xsl:stylesheet>
您需要生成一个 mso-application
处理指令,该指令应出现在文档根元素之前。我们可以为此创建一个模板:
<xsl:template match="/">
<xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
<Workbook>
<xsl:apply-templates select="companies" />
</Workbook>
</xsl:template>
此模板将被处理一次,因为它与根匹配。它将调用 companies
元素来处理样式表的其余部分。这是一个最小的模板。您也可以将元数据标签、样式等放置在那里。
我们也可以将工作表代码放置在根模板中。我决定将其分开,以避免使用大模板。由于只有一个 companies
节点,因此该节点也只会被处理一次。它将创建一个 WorkSheet
、一个 Table
并调用一些其他模板来处理各个行和单元格。
<xsl:template match="companies">
<Worksheet ss:Name="{@name}">
<Table x:FullColumns="1" x:FullRows="1">
<Row><!-- Header Row -->
<xsl:apply-templates select="company[1]/*" mode="headers"/>
</Row>
<xsl:apply-templates select="company" />
<Row><!-- Last Row -->
<Cell ss:Index="4"><Data ss:Type="String">Total:</Data></Cell>
<Cell ss:Formula="=SUM(R[-{count(company)}]C:R[-1]C)">
<Data ss:Type="Number"></Data>
</Cell>
</Row>
</Table>
</Worksheet>
</xsl:template>
第一行
将包含标题。由于 XML 源没有 header 名称,因此我们将使用第一个 company
的子元素 names 创建它们(这是在单独的模板中完成的)。各个行和单元格也将在单独的模板中进行处理,但在这里我们创建最后行。我们在第 4 列中放置一个单元格来打印文本“Total:”,并在下面行中插入一个 Excel 公式,该公式将对前面的 n 行进行求和,其中n是公司
节点总数(R(-n)C:R(-1)C
将计算为E2: E4
的内容如下:“从这一行 - 计数(公司) 到这一行 - 1”)。
其他模板使用 ss:Type
信息为每行和数据单元格创建代码(要求和的字段必须为 Number
类型)。
这是完整的样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<xsl:processing-instruction name="mso-application">progid="Excel.Sheet"</xsl:processing-instruction>
<Workbook>
<xsl:apply-templates select="companies" />
</Workbook>
</xsl:template>
<xsl:template match="companies">
<Worksheet ss:Name="{@name}">
<Table x:FullColumns="1" x:FullRows="1">
<Row><!-- Header Row -->
<xsl:apply-templates select="company[1]/*" mode="headers"/>
</Row>
<xsl:apply-templates select="company" />
<Row><!-- Last Row -->
<Cell ss:Index="4"><Data ss:Type="String">Total:</Data></Cell>
<Cell ss:Formula="=SUM(R[-{count(company)}]C:R[-1]C)">
<Data ss:Type="Number"></Data>
</Cell>
</Row>
</Table>
</Worksheet>
</xsl:template>
<xsl:template match="company[1]/*" mode="headers">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="name()" />
</Data>
</Cell>
</xsl:template>
<xsl:template match="company">
<Row>
<xsl:apply-templates select="*" />
</Row>
</xsl:template>
<xsl:template match="companyName|serviceID|startDate|endDate">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:template>
<xsl:template match="hours">
<Cell>
<Data ss:Type="Number">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:template>
</xsl:stylesheet>
将结果保存在扩展名为 .xls
的文件中(不是 .xslx
),然后在 Excel 中打开它。您将拥有一个电子表格,其中包含一个名为“我的公司”的工作表,该表的一列中的每个字段以及最后一行/列中的总小时数均以 Excel 公式计算。
这是一个 fiddle 包含应用于我在本答案开头提供的源的样式表(可能类似于您的源)。以下是结果列表:
<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<Worksheet ss:Name="My Companies">
<Table x:FullColumns="1" x:FullRows="1">
<Row>
<Cell>
<Data ss:Type="String">companyName</Data>
</Cell>
<Cell>
<Data ss:Type="String">serviceID</Data>
</Cell>
<Cell>
<Data ss:Type="String">startDate</Data>
</Cell>
<Cell>
<Data ss:Type="String">endDate</Data>
</Cell>
<Cell>
<Data ss:Type="String">hours</Data>
</Cell>
</Row>
<Row>
<Cell>
<Data ss:Type="String">Cool Beans</Data>
</Cell>
<Cell>
<Data ss:Type="String">1</Data>
</Cell>
<Cell>
<Data ss:Type="String">01-01-2014 00:00:00</Data>
</Cell>
<Cell>
<Data ss:Type="String">01-02-2014 00:00:00</Data>
</Cell>
<Cell>
<Data ss:Type="Number">2</Data>
</Cell>
</Row>
<Row>
<Cell>
<Data ss:Type="String">Hot Beans</Data>
</Cell>
<Cell>
<Data ss:Type="String">2</Data>
</Cell>
<Cell>
<Data ss:Type="String">01-01-2014 00:00:00</Data>
</Cell>
<Cell>
<Data ss:Type="String">01-02-2014 00:00:00</Data>
</Cell>
<Cell>
<Data ss:Type="Number">2</Data>
</Cell>
</Row>
<Row>
<Cell>
<Data ss:Type="String">Evil Beans</Data>
</Cell>
<Cell>
<Data ss:Type="String">3</Data>
</Cell>
<Cell>
<Data ss:Type="String">01-03-2014 00:00:00</Data>
</Cell>
<Cell>
<Data ss:Type="String">01-04-2014 00:00:00</Data>
</Cell>
<Cell>
<Data ss:Type="Number">2</Data>
</Cell>
</Row>
<Row>
<Cell ss:Index="4">
<Data ss:Type="String">Total:</Data>
</Cell>
<Cell ss:Formula="=SUM(R[-3]C:R[-1]C)">
<Data ss:Type="Number"/>
</Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
这是在 Excel for Mac 2011 中加载后结果文件的屏幕截图:
单击位置 Row(5)Col(5)
或 E5
) 计算总计的字段,您应该看到它存储了 Excel 公式,该公式添加了3
字段正确使用 Row(5-3)Col(5):Row(5-1)Col(5)
中的数据 (E2:E4
):
关于xml - 将 Excel 的 SUM() 添加到 XLST 结果页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898158/
编辑: 这是我能想到的 lxml 中最小的测试用例(完全用 Python 编写) from lxml import etree xslt_tree = etree.XML('''\
我按照 symfony 教程构建了我的第一个 symfony 项目。当我运行时: ./symfony propel:build-sql 我收到一个错误: [propel-sql] Could not
我是 C++ 的新手并继承了以下代码,这些代码应该使用 XSLT 文件转换给定的 XML 以仅吐出文本值。 它可以很好地加载 XML 和 XSLT,并且 transformnode() 调用返回成功,
我是一名编程爱好者,我从来没有与 DOM 相处得很好,所以我很确定我找不到答案,因为它对一个称职的程序员来说太明显了。 也就是说,互联网上有几个地方明确表示 xalt 样式表生成表单链接(来自 IBM
我只是想就如何改进我编写 XSLT 文件的方式寻求建议。我还想问问有没有人知道如何分离专门用于XSLT文件的CSS文件。任何建议都会对我有很大帮助 在此先感谢大家。
我有一个默认安装的 xampp,它有 php 5.3。我在使用 symfony 框架 CLI 创建数据库表时遇到了一个问题。我正在使用 Windows XP。这是我运行的命令: symfony pr
我计划在 azure 中编写一个 Web 应用程序,但我有一个问题......为了发送电子邮件,我使用了我前段时间编写的类库,我在 xlst 文件中有电子邮件模板,每次我想发送电子邮件时,我都会创建一
如何将 SUM() 函数应用于每个 hours 节点?我将把这个转换后的 XML 保存为 Excel,我希望它嵌入 SUM() 函数。经过研究,似乎有很多方法可以做到这一点,但没有一个真正适用于我的问
我是一名优秀的程序员,十分优秀!