XSL уникальный ключ значения - PullRequest
1 голос
/ 16 марта 2011

Цель

(XSLT 1.0). Моя цель - взять набор элементов S и создать другой набор T, где T содержит уникальные элементы в S. И сделать это максимально эффективно. (Примечание: мне не нужно создавать переменную, содержащую набор или что-то в этом роде. Мне просто нужно перебрать уникальные элементы).

Пример ввода и клавиша

<!-- My actual input consists of a bunch of <Result> elements -->
<AllMyResults>
<Result>
<someElement>value</state>
<otherElement>value 2</state>
<subject>Get unique subjects!</state>
</Result>
</AllMyResults>

<xsl:key name="SubjectKey" match="AllMyResults/Result" use="subject"/>

Я думаю, что вышесказанное работает, но когда я использую свой ключ, он невероятно медленный. Ниже приведен код использования моего ключа.

<xsl:for-each select="Result[count(. | key('SubjectKey', subject)[1]) = 1]">
    <xsl:sort select="subject" />
            <!-- Do something with the unique subject value -->
    <xsl:value-of select="subject" />
</xsl:for-each>

Дополнительная информация

Я считаю, что я делаю это неправильно, потому что это значительно замедлило мой XSL. В качестве дополнительной информации приведенный выше код находится в отдельном файле XSL от моего основного файла XSL. Из основного XSL я вызываю шаблон, содержащий xsl: key и for-each, показанные выше. Входными данными для этого шаблона является параметр xsl: param, содержащий мой набор узлов (аналогично приведенному выше примеру входных данных).

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Я не вижу никакой причины из приведенной информации, почему код должен быть медленным.Возможно, стоит посмотреть, происходит ли медлительность на всех процессорах XSLT или она свойственна одному.

0 голосов
/ 16 марта 2011

Попробуйте заменить

count(. | key('SubjectKey', subject)[1]) = 1

с

generate-id() = generate-id(key('SubjectKey', subject)[1])

В некоторых процессорах XSLT последний работает намного быстрее.

...