【发布时间】:2009-06-02 11:24:45
【问题描述】:
如果这是一个非常简单的问题,我们深表歉意;我不太使用 XSLT,在网上也找不到太多建议,因为搜索结果有很多污染!
我有一个格式如下的 XML 文档。它的主要目的是通过 XSLT 以几种方式重新格式化,以便以几种不同的格式显示。
<desk>
<drawer>
<contents>pencils</contents>
<quantity>2</quantity>
</drawer>
<drawer>
<contents>pens</contents>
<quantity>15</quantity>
</drawer>
<drawer>
<contents>pencils</contents>
<quantity>3</quantity>
</drawer>
<drawer>
<contents>rulers</contents>
<quantity>2</quantity>
</drawer>
</desk>
我想从xml中提取两条信息:i)平均数量; ii) 在 xml 中出现次数最多的内容(即“铅笔”,因为它出现两次,而不是“钢笔”,因为它的数量最多)。这个想法是,这可以通过管道传输到一个非常简单的 shell 脚本中。因此,我认为获取此信息的最简单方法是编写几个简短的 xsl 样式表,然后使用 xsltproc 获取数据。
第一条信息似乎直截了当。样式表的核心是这一行:
<xsl:value-of select="(sum(drawer/quantity)) div (count(drawer))" />
但我有点被第二个卡住了。
我想我可以使用这样的 for 循环遍历每个单独内容的列表:
<xsl:for-each select="drawer[not(contents = preceding-sibling::drawer/contents)]" />
但我不太确定如何计算具有 $current_contents 的元素数量及其内容元素的值。我也看不到按结果排序的简单方法,因此我可以获得最常遇到的内容值的名称。
我觉得这在 XSLT 2.0 中更容易,因为它有各种分组选项,但不幸的是,xsltproc 似乎不支持这一点。任何帮助将不胜感激。
非常感谢,
雅各布
【问题讨论】: