В ответ на ваш ближайший вопрос, чтобы вывести правильное количество t элементов для члена, вы можете сделать что-то вроде этого:
<xsl:apply-templates select="../member/@t[. = current()/@t]"/>
Итак, он выведетзначение для каждого соответствующего атрибута @t.
Однако я думаю, что вам нужно больше узнать о группировке, как предложил мистер Майкл Кей в своем последнем вопросе.
В этом случае выгруппируются по атрибуту group и атрибуту member .Итак, вы бы определили ключ, например:
<xsl:key name="members" match="member" use="concat(../@i, '|', @t)"/>
Обратите внимание на использование канала | для объединения двух частей ключа.Вам нужно будет выбрать символ, который не может встречаться ни в одной части ключа.
Затем вы можете получить первый элемент каждой группы следующим образом:
<xsl:apply-templates
select="group/member[generate-id() = generate-id(key('members', concat(../@i, '|', @t))[1])]"
mode="group"/>
И перебиратьвсе элементы в группе, вы можете сделать это ...
<xsl:apply-templates select="key('members', concat(../@i, '|', @t))"/>
Итак, учитывая следующий XML
<groups>
<group i="1">
<member t="P.M" c="Y">ABC</member>
<member t="P.L">PQR</member>
<member t="M">XYZ</member>
</group>
<group i="2">
<member t="M" c="Y">ABC</member>
<member t="M">PQR</member>
</group>
<group i="3">
<member t="P.L" c="Y">ABC</member>
<member t="M">PQR</member>
<member t="M">XYZ</member>
</group>
<group i="4">
<member t="M">ABC</member>
<member t="M" c="Y">PQR</member>
</group>
<group i="5">
<member t="M">ABC</member>
<member t="M" c="Y">PQR</member>
<member t="M" c="Y">XYZ</member>
</group>
<group i="6">
<member t="M" c="Y">ABC</member>
</group>
</groups>
Используя следующий XSLT ....
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="members" match="member" use="concat(../@i, '|', @t)"/>
<xsl:template match="/groups">
<xsl:apply-templates select="group/member[generate-id() = generate-id(key('members', concat(../@i, '|', @t))[1])]" mode="group"/>
</xsl:template>
<xsl:template match="member" mode="group">
<xsl:apply-templates select="key('members', concat(../@i, '|', @t))"/>
<xsl:text>, </xsl:text>
<xsl:apply-templates select="../member/@t[. = current()/@t]"/>
<xsl:variable name="others" select="count(following-sibling::member[@t != current()/@t])" />
<xsl:choose>
<xsl:when test="$others > 1">, </xsl:when>
<xsl:when test="$others = 1"> and </xsl:when>
<xsl:otherwise>
<xsl:text> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="member">
<xsl:choose>
<xsl:when test="@c='Y'">
<u>
<xsl:value-of select="."/>
</u>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
<xsl:variable name="others" select="count(following-sibling::member[@t = current()/@t])" />
<xsl:choose>
<xsl:when test="$others > 1">, </xsl:when>
<xsl:when test="$others = 1"> and </xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Выводится следующее ....
<u>ABC</u>, P.M, PQR, P.L and XYZ, M
<u>ABC</u> and PQR, MM
<u>ABC</u>, P.L, PQR and XYZ, MM
ABC and <u>PQR</u>, MM
ABC, <u>PQR</u> and <u>XYZ</u>, MMM
<u>ABC</u>, M