@darkmayers

Как работает группировка Мюнха?

Добрый день!

Уважаемые знатоки! Освоил группировку методом Мюнха. Понимаю, что:
1) Для выборки множества узлов по их свойствам используются ключи (xsl:key).
2) При помощи функции generate-id можно выяснить, является ли узел первым узлом множества в порядке просмотра xml-документа.

Но у меня вопрос. И что?

Вот фрагмент кода, которые работает:
<xsl:key name="group" match="item" use="@group"/>

<xsl:template match="list">
  <group-list>
    <xsl:apply-templates 
      select="item[generate-id(.) = generate-id(key('group',@group))]" <!--Магия у нас тут-->
    />
  </group-list>
</xsl:template>
  
<xsl:template match="item">
  <group name="{@group}">
    <xsl:for-each select="key('group',@group)">
      <item name="{@id}"/>
    </xsl:for-each>
  </group>
</xsl:template>


Читал статьи, в которых описывается этот метод, но все равно не полностью понимаю.
Может кто то может рассказать подробнее?
  • Вопрос задан
  • 1113 просмотров
Решения вопроса 1
@farza
Web - Developer
XSL - элемент key

Простое определение
Ключ может содержать элемент или множество элементов. Получить элемент или множество элементов из ключа можно при помощи функции key() по переданному в качестве аргумента значению.

Определение из учебника
Элемент объявляет именованный ключ, т. е. пару «имя-значение», связанную с указанным элементом в XML-документе. Этот ключ используется с фукнцией key() в выражениях XPath для осуществления эффективного доступа к связанным элементам в сложном XML-документе.


Оригинал
The element is a top-level element which declares a named key that can be used in the style sheet with the key() function.


Ссылки на документацию
https://www.w3schools.com/xml/ref_xsl_el_key.asp

В примере выше создается ключ с именем group, который содержит множество item (match="item") и этот элемент "item" или его множество можно получить по значению атрибута group (use="@group").

В примере выше в ключе «group» содержится множество «item», доступ к которым можно получить по значению атрибута «group» через функцию «key()».

generate-id

Простое определение
Возвращает строку, которая уникально идентифицирует первый узел документа. Если в функцию передать множество, то будет возращен уникальный id первого элемента из этого множества

Определение из учебника
Функция generate-id возвращает уникальный строковый идентификатор первого в порядке просмотра документа узла, передаваемого ей в виде аргумента. Если аргумент опущен, функция возвращает уникальный идентификатор контекстного узла. Если аргументом является пустое множество, функция должна возвращать пустую строку.

Функция generate-id возвращает для двух узлов один и тот же идентификатор тогда и только тогда, когда эти два узла совпадают. Это означает, что во время выполнения одного преобразования функция generate-id будет возвращать один идентификатор для одного и того же узла, а для разных узлов generate-id обязательно возвратит разные идентификаторы.


Оригинал
The generate-id() function returns a string value that uniquely identifies a specified node.

If the node-set specified is empty, an empty string is returned. If you omit the node-set parameter, it defaults to the current node.


Ссылки на документацию
https://xsltdev.ru/xpath/generate-id/
https://www.w3schools.com/xml/func_generateid.asp

Квадратные скобки

Простое определение
Существует возможность ограничить количество элементов, отвечающих шаблону, введя фильтр — выражение, заключенное в квадратные скобки и следующее непосредственно за оператором пути.

Этой строчкой
<xsl:apply-templates select="item[generate-id(.) = generate-id(key('group',@group))]" />

мы говорим следующее:
Примени все шаблоны к тем элементам item, которые соответствуют критерии (фильтру), который указан в квадратных скобках

В этой части
key('group',@group)

мы говорим следующее:
Дайте мне множество элементов «item» из ключа «group», значение атрибута «group» которых равняется значению атрибута «group» у «item» находящегося в XML документе

Идем далее. Этой строчкой
generate-id(key('group',@group)
Мы говорим следующее
Вернув множество item с одинаковым значением атрибута «group», дай мне id первого элемента из множества

Этой строчкой
item[generate-id(.) = generate-id(key('group',@group))]

Мы говорим следующее
Примени все шаблоны для элементов «Item», generate-id которых равняется уникальному generate-id элемента.

В итоге получается, что шаблоны применятся только для элементов «item» с уникальным атрибутом «group»

Подробнее с примерами:
geekspace.info/notes/1
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы