Извинения, если это очень простой вопрос; Я не очень часто использую XSLT и не могу найти много советов в Интернете, так как в результатах поиска много загрязнений!
У меня есть XML-документ в следующей форме. Его основная цель - несколько отформатировать XSLT для отображения в нескольких различных форматах.
<desk>
<drawer>
<contents>pencils</contents>
<quantity>2</quantity>
</drawer>
<drawer>
<contents>pens</contents>
<quantity>15</quantity>
</drawer>
<drawer>
<contents>pencils</contents>
<quantity>3</quantity>
</drawer>
<drawer>
<contents>rulers</contents>
<quantity>2</quantity>
</drawer>
</desk>
Я бы хотел извлечь из XML две части информации: i) среднее количество; ii) наиболее часто встречающееся содержимое по количеству появлений в xml (то есть «карандаши», потому что оно появляется дважды, а не «ручки», потому что оно имеет наибольшее количество). Идея состоит в том, что это может быть передано в очень простой сценарий оболочки. Поэтому я подумал, что самый простой способ получить эту информацию - написать пару коротких таблиц стилей xsl, а затем использовать xsltproc для получения данных.
Первая часть информации кажется простой. Сердцем таблицы стилей будет эта строка:
<xsl:value-of select="(sum(drawer/quantity)) div (count(drawer))" />
но я немного застрял на втором.
Я думаю, что могу использовать что-то вроде этого для цикла по списку каждого отдельного контента:
<xsl:for-each select="drawer[not(contents = preceding-sibling::drawer/contents)]" />
но я не совсем уверен, как тогда подсчитать количество элементов, которые имеют $ current_contents и значение их элемента содержимого. Также я не вижу простого способа сортировки по результатам, чтобы получить имя наиболее часто встречающегося значения содержимого.
У меня такое ощущение, что это проще в XSLT 2.0 с его различными опциями группировки, но, к сожалению, xsltproc, похоже, этого не поддерживает. Любая помощь будет принята с благодарностью.
Большое спасибо,
Jacob