1

给定xml代码

<z>
<f hit="1">
<g>hola1</g>
</f>
<f hit="2">
<g>hola2</g>
</f>
<f hit="3">
<g>hola1</g>
</f>
</z>

我想要xml输出

<z>
hola1
hola2
</z>

使用 xslt1。然后,一个简单的解决方案是 muenchian 分组

<xsl:key name="thisone" match="/z/f/g" use="." />
<z>
<xsl:for-each select="/z/f[generate-id(g)=generate-id(key('thisone',g)[1])]">
<xsl:value-of select="g" />
</xsl:for-each>
</z>

但是,当我将其应用于大型数据集时,系统(firefox)一直在思考。我认为这是由于数据集非常大。但是,“g”的不同值的数量确实很少。

我的问题是:有没有办法对 Muenchian 分组的节点进行 for-each 循环?就像是

<xsl:for-each select="nodes_of_key('thisone')">

这将避免比较所有“g”节点的所有值,这需要永远?

谢谢

4

1 回答 1

0

不需要任何<xsl:for-each>指令来解决这个问题(最好避免使用该指令):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kFByG" match="f" use="g"/>

 <xsl:template match="/*">
     <z>
      <xsl:apply-templates/>
      <xsl:text>&#xA;</xsl:text>
     </z>
 </xsl:template>

 <xsl:template match="f[generate-id()=generate-id(key('kFByG',g)[1])]">
     <xsl:text>&#xA;</xsl:text>
     <xsl:value-of select="g"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<z>
    <f hit="1">
        <g>hola1</g>
    </f>
    <f hit="2">
        <g>hola2</g>
    </f>
    <f hit="3">
        <g>hola1</g>
    </f>
</z>

产生了想要的正确结果:

<z>
hola1
hola2
</z>
于 2012-11-20T01:33:10.350 回答