У меня есть следующая структура данных, и мне нужно вывести идентификаторы каждого узла с каждой комбинацией v1
и v2
ровно один раз, где v
равно A
.
Узлы с идентификаторами 2,3,4,6,7
должны быть напечатаны.
<root>
<node>
<v>A</v>
<id>2</id>
<v1>S</v1>
<v2>S</v2>
</node>
<node>
<v>A</v>
<id>3</id>
<v1>S</v1>
<v2>S1</v2>
</node>
<node>
<v>A</v>
<id>4</id>
<v1>S2</v1>
<v2>S1</v2>
</node>
<node>
<v>B</v>
<id>5</id>
<v1>S2</v1>
<v2>S3</v2>
</node>
<node>
<v>A</v>
<id>6</id>
<v1>S2</v1>
<v2>S3</v2>
</node>
<node>
<v>A</v>
<id>7</id>
<v1>S</v1>
<v2>S3</v2>
</node>
<node>
<v>A</v>
<id>8</id>
<v1>S</v1>
<v2>S</v2>
</node>
</root>
Я пытался использовать xsl:key
, однако, к сожалению, печатаются только уникальные элементы (id = 2 отсутствует)
Использование preceeding
, как показано ниже, не дает желаемого результата.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<!-- pos 1 -->
<xsl:key name="keys" match="node" use="concat(v1, '|', v2, '|', v)"/>
<!-- /pos 1 -->
<xsl:template match="root">
<xsl:for-each select="node[v='A']">
<!-- pos 1 -->
<xsl:variable name="vDups" select="key('keys', concat(v1, '|', v2, '|', v))[not(generate-id() = generate-id(current()))]" />
<xsl:if test="not($vDups)">
<node>
<xsl:value-of select="current()/id"/>
</node>
</xsl:if>
<!-- /pos 1 -->
<!-- pos 2 -->
<xsl:if test="not(preceding::node/v1=current()/v1 and preceding::node/v2 = current()/v2)">
<node>
<xsl:value-of select="id" />
</node>
</xsl:if>
<!-- /pos 2 -->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Как мне достичь желаемого результата?