'HIERARCHY_REQUEST_ERR:尝试插入不允许的节点。 |当我复制set的结果时:distinct

时间:2012-09-28 12:27:42

标签: java eclipse xslt xalan

我尝试转换(在eclipse中)下面的文档:

<doc>
   <city name="Paris"
         country="France" />
   <city name="Madrid"
         country="Spain" />
   <city name="Vienna"
         country="Austria" />
   <city name="Barcelona"
         country="Spain" />
   <city name="Salzburg"
         country="Austria" />
   <city name="Bonn"
         country="Germany" />
   <city name="Lyon"
         country="France" />
   <city name="Hannover"
         country="Germany" />
   <city name="Calais"
         country="France" />
   <city name="Berlin"
         country="Germany" />
</doc>

使用xslt:

<xsl:template match="/">
   <out>
      <all-countries>
            <xsl:copy-of select="//city" />
      </all-countries>
      <distinct-countries>
            <xsl:copy-of select="set:distinct(//@country/..)" />
      </distinct-countries>
   </out>
</xsl:template>

我使用 Xalan 2.7.1 它工作正常,但当我使用'JRE Instance Default'处理器时,我收到错误:

16:07:20,642 ERROR [main] Main  - java.lang.RuntimeException: Run-time internal error in 'HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. '

1 个答案:

答案 0 :(得分:1)

这是猜测,但也许您可以尝试其他方式来获取不同的值。以下是两个建议,两者都是XSLT2.0解决方案:

<distinct-countries>
    <xsl:copy-of select="distinct-values(//@country)" /> 
</distinct-countries>

<xsl:for-each-group select="//city" group-by="@country">
  <xsl:value-of select="current-grouping-key()" />
</xsl:for-each-group>

如果您使用的是XSLT1.0,不使用扩展函数的方法,则可以使用一种名为Muenchian Grouping的技术。首先,按照国家/地区属性定义一个“组合”城市元素的键。

<xsl:key name="countries" match="city" use="@country" />

然后,您可以通过选择每个组中出现的第一个城市元素来挑选出不同的国家/地区。

<distinct-countries> 
   <xsl:for-each select="//city[generate-id() = generate-id(key('countries', @country)[1])]"> 
      <xsl:value-of select="@country" />
   </xsl:for-each>
</distinct-countries>