【发布时间】:2014-03-18 09:08:20
【问题描述】:
我有以下 xml 文件。
<?xml version="1.0" encoding="UTF-8"?>
<rss>
<channel>
<item>
<status>Identify</status>
<component>Department A</component>
<component>Department ABC</component>
</item>
<item>
<status>Identify</status>
<component>Department B</component>
<component>Department BCD</component>
</item>
<item>
<status>In Progress</status>
<component>Department A</component>
<component>Redundant</component>
</item>
<item>
<status>Identify</status>
<component>Department B</component>
<component>Redundant</component>
</item>
</channel>
</rss>
我希望 html 中的输出如下表所示
Departments | Identify | In Progress
Department A | 0 | 1
Department B | 1 | 0
Department ABC | 1 | 0
Department BCD | 1 | 0
Total (4 records) | 3 | 1
这就是数字背后的逻辑。 如果一个项目有多个组件,请仅选择一个名称最长的组件。 必须忽略任何不以“部门”开头的组件。 每个项目始终只有一个状态。
我对 xslt 和 xpath 很陌生。即使经过大量的谷歌搜索,我现在已经被困在这个问题上好几天了。有哪位大师,请帮忙:) 真的很感激。
非常感谢。 比派
这是我迄今为止所尝试的……显然,离我想要的位置还有很长的路要走。但是我对接下来的步骤一无所知,因为 xslt 逻辑与普通的顺序编程逻辑有很大不同。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:key name="components" match="/rss/channel/item/component" use="./text()"/>
<xsl:template match="/rss/channel">
<xsl:for-each select="item/component[generate-id(.) = generate- id(key('components', .))]">
<xsl:sort select="."/>
<xsl:if test="contains(text(),'Department')">
<h1>
<xsl:value-of select="text()"/>
<xsl:value-of select="count(key('components', .))"/>
</h1>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
只能使用 XSLT 1.0 吗?如果您有 XSLT 2.0 处理器,则不需要 Muenchian 分组来对元素进行分组。
-
是的,很遗憾,我只能使用 XSLT 1.0。
-
很好。我不确定这里是否需要分组。给定部门可以有多个“确定”或“进行中”吗?
-
是的,可以有 Mathias。