当我需要的密钥可以从输入文件中跨组重复时,我无法生成汇总组。我正在使用muenchian方法进行分组,因为我遇到了xslt 1.0,我无法更改输入模式。
<groups>
<group id="1">
<members>
<member name="A">
<udf @name="key">1</customId>
</member>
<member name="B">
<udf @name="key">1</customId>
</member>
</members>
</group>
<group id="2">
<members>
<member name="C">
<udf @name="key">1</customId>
</member>
<member name="D">
<udf @name="key">2</customId>
</member>
<member name="E">
<udf @name="key">3</customId>
</member>
</members>
</group>
</groups>
我想要产生的输出是:
<group id="1">
<member key="1" />
</group>
<group id="2">
<member key="1" />
<member key="2" />
<member key="3" />
</group>
我也在对每个元素进行其他处理,但这是切向的。
我有一个运行循环并生成密钥的模板:
<xsl:tempalte name="process">
<xsl:for-each select="groups/group">
<xsl:call-template name="getMembers"/>
</xsl:for-each>
</xsl:tempalte>
<xsl:key name="keyId" match="member" use="udf/@name[.='key']/.."/>
<xsl:template name="getMembers>
<xsl:for-each select="members/member[generate-id() = generate-id(key('keyId',udf/@name[.='key']/..))]">
<!-- emits the grouped tags. -->
</xsl:for-each>
</xsl:template>
到目前为止,我对这种转变的看法是:
<group id="1">
<member key="1" />
</group>
<group id="2">
<member key="2" />
<member key="3" />
</group>
..你会在组2中看到它丢失的密钥1.所以,我很困惑为什么第二次调用模板时,生成id函数没有为值“1”发出新的唯一键“即使我在第2组的上下文中调用生成id。
答案 0 :(得分:5)
您需要使用带有group
或members
父级的连锁密钥,例如
<xsl:key name="keyId" match="member" use="concat(generate-id(parent::members/parent::group), '|', udf[@name = 'key'])"/>
当然,当然你在哪里使用你需要的关键功能,以确保你用相同的表达式计算它,例如
<xsl:for-each select="members/member[generate-id() = generate-id(key('keyId', concat(generate-id(parent::members/parent::group), '|', udf[@name = 'key'])))]">