我有以下XML:
<InterSection criteria="Microsoft-ASP">value</Intersection>
<InterSection criteria="Microsoft-MVC">value</Intersection>
<InterSection criteria="HP-MVC">value</Intersection>
我需要在HTML页面的顶部创建TOC,因此我需要按标准分组(第一部分在' - '之前)。
我需要像
这样的不同值我的XSLT有以下代码
<a>
<xsl:attribute name="href">
<xsl:text>#trigger</xsl:text>
<xsl:value-of select="position()"/>
</xsl:attribute>
<xsl:for-each-group select="." group-by="substring-before(@Criteria, ' - ')">
<xsl:value-of select="substring-before(@Criteria, ' - ')"/>
<xsl:text>
</xsl:text>
</xsl:for-each-group>
</a>
但不知怎的,我得到了
我在XSLT中写了以下内容
<xsl:template match="InterSection" mode="TOC">
<li>
<a>
<xsl:attribute name="href">
<xsl:text>#trigger</xsl:text>
<xsl:value-of select="position()"/>
</xsl:attribute>
<xsl:for-each-group select="." group-by="substring-before(@Criteria, ' - ')">
<xsl:value-of select="current-grouping-key()"/>
<xsl:for-each select="current-group()"/>
</xsl:for-each-group>
</a>
</li>
答案 0 :(得分:1)
我终于要总结一下我要在你的工作中解决的问题,以使其工作(删除以前的编辑):
criteria
substring
表达式在第二个参数-
current-grouping-key()
来获取当前匹配组的值InterSection
(Root
)的父级匹配,然后您必须像InterSection
xsl:for-each
答案 1 :(得分:1)
<xsl:for-each-group select="." group-by="substring-before(@Criteria, ' - ')">
这没有意义。 select
属性中的表达式选择单个项。当选择了多个项目时,分组具有意义,我们希望使用特定条件对它们进行分组。
当单个项目“分组”时,“结果”始终是相同的项目 - 这正是您得到的。
解决方案:正确选择要分组的一组项目。或者,使用此替代解决方案:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="vallKeys" select=
"distinct-values
(/*/*/@criteria
/substring-before(.,'-')
)
"/>
<xsl:template match="/">
<xsl:for-each select="$vallKeys">
<xsl:value-of select=
"concat(position(),'.',.,'
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(通过纠正其严重错误形式从提供的片段派生):
<someParent>
<InterSection criteria="Microsoft-ASP">value</InterSection>
<InterSection criteria="Microsoft-MVC">value</InterSection>
<InterSection criteria="HP-MVC">value</InterSection>
</someParent>
产生了想要的正确结果:
1.Microsoft
2.HP