'HIERARCHY_REQUEST_ERR: была предпринята попытка вставить узел там, где это не разрешено. | Когда я копирую результат набора: отличный

Я пытаюсь преобразовать (в 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. '

person CAMOBAP    schedule 28.09.2012    source источник


Ответы (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, способ сделать это без использования функции расширения — использовать технику, называемую мюнхианской группировкой. Сначала определите ключ для «группировки» элементов города по их атрибуту страны.

<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> 
person Tim C    schedule 29.09.2012
comment
Насколько я понимаю, xsl:for-each-group доступен только в XSLT 2.0. Правильный? - person CAMOBAP; 30.09.2012
comment
Ах да, это решения XSLT2.0. Если у вас есть только XSLT1.0, вы можете использовать технику, называемую мюнхианской группировкой. Если это так, я могу расширить свой ответ, чтобы показать это. - person Tim C; 30.09.2012