我有按给定属性分组的代码。当我给出确切的属性名称时,它工作正常。但是,我想使用 Javascript xsltProcessor.setParameter 进行参数化以设置分组的属性名称。
据我所知,XSLT 1.0 不允许在 xsl:key 匹配或使用属性中使用变量或参数。因此,如果我不能通过这种方式进行参数化,我想,我需要编写这么多的 XSL 文件,就像我想使用的按属性分组一样多。如果有人能给我一个技巧或解决方案,我将不胜感激。
这是准确给出属性的 xls,效果很好:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="groupName" match="stickieshighlights/item" use="@color"/>
<xsl:key name="eachitem" match="stickieshighlights/item" use="concat(@color,'|', @id)"/>
<xsl:template match="stickieshighlights">
<stickieshighlights>
<xsl:apply-templates select="item[generate-id()=generate-id(key('groupName',@color)[1])]" mode="groupby"/>
</stickieshighlights>
</xsl:template>
<xsl:template match="item" mode="groupby">
<color name="{@color}">
<xsl:apply-templates select="key('groupName',@color)[generate-id()=generate-id(key('eachitem',concat(@color,'|', @id))[1])]" mode="list"/>
</color>
</xsl:template>
<xsl:template match="item" mode="list">
<item id="{@id}" icon="{@icon}" date="{@date}" tags="{@tags}" url="{@url}" title="{@title}" content="{@content}" >
</item>
</xsl:template>
</xsl:stylesheet>
这是我尝试使用参数,但出现错误:键不能在表达式中包含变量。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="group_By" />
<xsl:key name="groupName" match="stickieshighlights/item" use="$group_By"/>
<xsl:key name="eachitem" match="stickieshighlights/item" use="concat($group_By,'|', @id)"/>
<xsl:template match="stickieshighlights">
<stickieshighlights>
<xsl:apply-templates select="item[generate-id()=generate-id(key('groupName',$group_By)[1])]" mode="groupby"/>
</stickieshighlights>
</xsl:template>
<xsl:template match="item" mode="groupby">
<xsl:element name="{$group_By}" >
<xsl:attribute name="{{$group_By}}"><xsl:value-of select="current()"/></xsl:attribute>
<xsl:apply-templates select="key('groupName',$group_By)[generate-id()=generate-id(key('eachitem',concat($group_By,'|', @id))[1])]" mode="list"/>
</xsl:element>
</xsl:template>
<xsl:template match="item" mode="list">
<item id="{@id}" icon="{@icon}" color="{@color}" date="{@date}" tags="{@tags}" url="{@url}" title="{@title}" content="{@content}" >
</item>
</xsl:template>
</xsl:stylesheet>