Как получить отличительные / уникальные атрибуты в переменной xsl - PullRequest
1 голос
/ 16 декабря 2011
<xsl:variable name="Rows" select=" .. some stmt .." />
<xsl:for-each select="$Rows">
    <xsl:value-of select="@ATTRNAME"/>
</xsl:for-each>

Хотелось бы узнать, как найти «строки» с уникальным / отличным атрибутом «ATTRNAME» [в XSLT 1.0].

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Группировка в XSLT 1.0 выполняется с использованием xsl:key. Далее печатаются только уникальные элементы корневого элемента:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:key name="attrByVal" match="/*/@*" use="."/>
    <xsl:template match="/">
        <xsl:apply-templates select="/*/@*"/>
    </xsl:template>
    <xsl:template match="@*[generate-id()=generate-id(key('attrByVal', .)[1])]">
        <xsl:value-of select="concat(name(), ': ', ., '&#xA;')"/>
    </xsl:template>
    <xsl:template match="@*"/>
</xsl:stylesheet>

Объяснение: Сначала мы сгруппируем все атрибуты корневого элемента по значению:

<xsl:key name="attrByVal" match="/*/@*" use="."/>

Затем создайте шаблон, который соответствует только первому элементу для каждого ключа в группе:

<xsl:template match="@*[generate-id()=generate-id(key('attrByVal', .)[1])]">

И игнорируйте все остальные:

<xsl:template match="@*"/>

Пример ввода:

<root one="apple" two="apple" three="orange" four="apple"/>

Выход:

one: apple
three: orange
0 голосов
/ 16 декабря 2011

XSLT 2.0 решение:

<xsl:for-each-group select="$Rows" group-by="@ATTRNAME">
 <!-- Do something with the rows in the group. These rows
 can be accessed by the current-group() function. -->
    </xsl:for-each-group>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...