2013-05-24 5 views
0

Я немного запутался об этой ключевой функции:XSLT - Основные функции()

<xsl:for-each select="article[count(. | key('idkey', @id)[1]) = 1]> 

Есть ли кто-нибудь, что можно кратко объяснить, Что происходит в этом для-каждого цикла?

Ключ: <xsl:key name="idkey" match="/newspapers/newspaper" use="@id"/>

@id является атрибутом в газете.

Спасибо.

ответ

-1

В этом for-each элемент

<xsl:for-each select="article[count(. | key('idkey', @id)[1]) = 1]"> 

for-each прикладывается к первому article элемента для каждого атрибута @id.

  • Вызов key('idkey', @id) выбирает все элементы article с тем же атрибутом @id в качестве текущего.

  • key('idkey', @id)[1] выбирает первый всех article элементов с одной и той же @id.

  • Поскольку узел не может появляться в узле установлен более чем один раз, объединение . | key('idkey', @id)[1]будет содержать один узел, если текущий article тот же узел, как первыйarticle с тем же @id. В противном случае он будет содержать два.

  • Проверка того, что значение count() является одним из элементов, которые являются первыми с любыми @id.

Альтернативный способ сделать это, и один я предпочитаю, чтобы использовать generate-id как этот

select="article[generate-id() = generate-id(key('idkey', @id)[1])]" 

, которая проверяет непосредственно является ли тот же один, как первый элемент в текущий элемент устанавливаются путем сравнения их сгенерированных идентификаторов.

+0

Извините, но вы ошибаетесь, потому что ключ ** idkey ** не является ключом к статье/@ id, это газета/@ id. Или я что-то пропустил? –

+0

@ hr_117: При написании я хотел, чтобы OP показывал декларацию для 'idkey'. Я почему-то не обратил на это внимания. Но, как и все, «select» XPath очень странно, потому что поскольку ни один узел node, возвращаемый 'key()', не может содержать элемент 'article', предикат будет таким же, как' 1 + count (key ('idkey' , @id) [1]) = 1' или, как вы говорите, 'not (key ('idkey', @id)). Это явно ошибка. – Borodin

2

Выражение key('idkey', @id)[1] выбирает первый элемент, idkey которого равен @id.

Выражение count(A|B) = 1 является обходным решением XSLT 1.0 для проверки того, являются ли A и B одним и тем же узлом. (Вы также увидите людей, использующих generate-id(A)=generate-id(B).)

Поместите их вместе, и вы спрашиваете, является ли текущий элемент первым в документе с определенным значением id.

Это основа метода Muenchian Grouping (который становится избыточным в XSLT 2.0).

В коде есть что-то подозрительное, потому что ключ, похоже, соответствует идентификатору газеты, а не идентификатору статьи. Но, возможно, они каким-то образом связаны.

Смежные вопросы