Проблема в сортировке XML в XSLT 2.0 какие-либо идеи? - PullRequest
3 голосов
/ 08 февраля 2010

Здравствуйте. Я пытаюсь отсортировать xml по номеру вхождения элемента ' answer ' с атрибутом ' id ' и получить простую сводку.

<person id="1">
 <answer id="A"/>
 <answer id="B"/>
</person>

<person id="2">
 <answer id="A"/>
 <answer id="C"/>
</person>

<person id="3">
 <answer id="C"/>
</person>

Я хочу просто краткий текст на выходе:

A = 2 раза (с)
C = 2 раз (а)
B = 1 раз (а)

В XSLT 2.0 я попробовал:

<xsl:for-each select="distinct-values(/person/answer)">
 <xsl:sort select="count(/person/answer)" data-type="number"/>
 <xsl:value-of select="./@id"/> = 
 <xsl:value-of select="count(/person/answer[@id=./@id])"/> time(s)
</xsl:for-each>

но это не работает:
в XMLSpy 2008:
«Ошибка в выражении XPath 2.0 Не элемент узла»

на саксонском 9:
XPTY0020: ведущий '/' не может выбрать корневой узел дерева, содержащий элемент контекста: элемент контекста является атомарным значением
Не удалось скомпилировать таблицу стилей. Обнаружена 1 ошибка.

1 Ответ

4 голосов
/ 08 февраля 2010

Я бы сгруппировал и посчитал предметы в каждой группе:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:for-each-group select="//person/answer" group-by="@id">
      <xsl:sort select="count(current-group())" order="descending"/>
      <xsl:value-of select="concat(current-grouping-key(), ' = ', count(current-group()), ' time(s).&#10;')"/>
    </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

Таким образом, при применении к входу

<root>
<person id="1">
 <answer id="A"/>
 <answer id="B"/>
</person>

<person id="2">
 <answer id="A"/>
 <answer id="C"/>
</person>

<person id="3">
 <answer id="C"/>
</person>
</root>

Я получаю результат

A = 2 time(s).
C = 2 time(s).
B = 1 time(s).
...