У меня есть это (упрощенный) XMLКак сортировать «присоединился к» Xsl набор узлов
<?xml version="1.0" encoding="iso-8859-1"?>
<LENEX version="3.0">
<MEETS>
<MEET name="British Gas Champs 2012">
<SESSIONS>
<SESSION number="1" name="Session 1" course="LCM" date="2012-07-22">
<EVENTS>
<EVENT eventid="104" number="104" gender="M" round="PRE" order="4">
<SWIMSTYLE distance="100" stroke="BACK" name="Boys 14 Yrs 100m Backstroke" />
<AGEGROUPS>
<AGEGROUP agegroupid="1" name="14 Yrs Age Group">
<RANKINGS>
<RANKING place="3" resultid="1" />
</RANKINGS>
</AGEGROUP>
</AGEGROUPS>
</EVENT>
</EVENTS>
</SESSION>
<SESSION number="2" name="Session 2" course="LCM" date="2012-07-22">
<EVENTS>
<EVENT eventid="207" number="207" gender="M" round="PRE" order="7">
<SWIMSTYLE distance="100" stroke="FREE" name="Boys 14 Yrs 100m Freestyle"/>
<AGEGROUPS>
<AGEGROUP agegroupid="1" name="14 Yrs Age Group">
<RANKINGS>
<RANKING place="1" resultid="2"/>
</RANKINGS>
</AGEGROUP>
</AGEGROUPS>
</EVENT>
</EVENTS>
</SESSION>
</SESSIONS>
<CLUBS>
<CLUB name="Aberdeen ASC" region="X" type="CLUB">
<ATHLETES>
<ATHLETE athleteid="1169" lastname="Butt" firstname="Suleman">
<RESULTS>
<RESULT resultid="1" eventid="104" swimtime="00:01:01.18"/>
<RESULT resultid="2" eventid="207" swimtime="00:00:53.06"/>
</RESULTS>
</ATHLETE>
</ATHLETES>
</CLUB>
</CLUBS>
</MEET>
</MEETS>
</LENEX>
и эту таблицу стилей
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl">
<xsl:variable name="session" select="/LENEX/MEETS/MEET/SESSIONS/SESSION" />
<xsl:variable name="athlete" select="/LENEX/MEETS/MEET/CLUBS/CLUB/ATHLETES/ATHLETE" />
<!-- variable for testing/debugging-->
<xsl:variable name="athlno" select="1169" />
<!--<xsl:param name="evno" />-->
<xsl:template match="/">
<html>
<head>
</head>
<body>
<xsl:apply-templates select="$athlete" />
</body>
</html>
</xsl:template>
<!-- find the results (@resultid) for athleteid in $athlno -->
<xsl:template match="ATHLETE[@athleteid]">
<xsl:choose>
<xsl:when test="self::ATHLETE[@athleteid = $athlno]/RESULTS">
<xsl:apply-templates select="child::RESULTS/RESULT">
<!-- these 'sorts' works -->
<!-- <xsl:sort select="@resultid" data-type="text" order="descending"/>
<xsl:sort select="@eventid" order="descending"/> -->
</xsl:apply-templates>
</xsl:when>
</xsl:choose>
</xsl:template>
<!-- create $res1 $stim1 variables to pass to 'SESSIONS' node -->
<xsl:template match="RESULT">
<xsl:variable name="res1" ><xsl:value-of select="@resultid"/></xsl:variable>
<xsl:variable name="stim1" ><xsl:value-of select="@swimtime"/></xsl:variable>
<tr>
<!--join to 'SESSIONS' node -->
<xsl:apply-templates select="$session/EVENTS/EVENT">
<!-- this xsl:sort doesn't work
<xsl:sort select="@number" data-type="text" order="descending"/>-->
<xsl:with-param name="res2" select="$res1"/>
<xsl:with-param name="stim2" select="$stim1"/>
</xsl:apply-templates>
</tr>
</xsl:template>
<xsl:template match="EVENT">
<xsl:param name="res2" />
<xsl:param name="stim2" />
<xsl:for-each select="child::AGEGROUPS/AGEGROUP/RANKINGS/RANKING[@resultid = $res2]">
<!-- this xsl:sort doesn't work -->
<xsl:sort select="@place" data-type="text" order="ascending"/>
<xsl:value-of select="@place"/>
<xsl:choose>
<xsl:when test="../../../../@round = 'TIM'">
<xsl:text> </xsl:text>HDW
</xsl:when>
<xsl:when test="../../../../@round = 'PRE'">
<xsl:text> </xsl:text>Heat
</xsl:when>
<xsl:when test="../../../../@round = 'SEM'">
<xsl:text> </xsl:text>Semi-F
</xsl:when>
<xsl:when test="../../../../@round = 'FIN'">
<xsl:text> </xsl:text>Final
</xsl:when>
<xsl:otherwise>
<xsl:text> </xsl:text>n/a
</xsl:otherwise>
</xsl:choose>
<xsl:text> </xsl:text><xsl:value-of select="../../../../SWIMSTYLE/@name" />
<xsl:text> </xsl:text><xsl:value-of select="substring($stim2,4)"/>
<xsl:text> </xsl:text><xsl:value-of select="../../../../@number" /><br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
я только кажется, чтобы иметь возможность сортировать по основной набор узлов, т.е. РЕЗУЛЬТАТЫ/RESULT/@ resultid или RESULTS/RESULT/eventid. Я хотел бы отсортировать результаты «join» с помощью EVENT/SWIMSTYLE/@ stroke, EVENT/SWIMSTYLE/@ distance и EVENT/@ round. Я ограничен XSLT 1.0. То, что я пробовал, прокомментировано в XSLT выше. Выход Я ищу это ...
3 Final Boys 14 Yrs 100m Backstroke 01:00.83 269
3 Heat Boys 14 Yrs 100m Backstroke 01:01.18 104
3 Semi-F Boys 14 Yrs 100m Backstroke 01:00.66 156
1 Final Boys 14 Yrs 100m Freestyle 00:52.61 363
1 Heat Boys 14 Yrs 100m Freestyle 00:53.06 207
1 Semi-F Boys 14 Yrs 100m Freestyle 00:53.56 259
1 Final Boys 14 Yrs 200m Freestyle 01:53.34 555
1 Heat Boys 14 Yrs 200m Freestyle 01:57.29 402
1 Semi-F Boys 14 Yrs 200m Freestyle 01:55.23 454
1 Final Boys 14 Yrs 400m Freestyle 04:03.46 351
1 Heat Boys 11/14 Yrs 400m Freestyle 04:09.46 301
Привет, добро пожаловать в переполнение стека. Попробуйте опубликовать свой код, чтобы мы могли вам помочь ;-) –
Как выглядит ваш желаемый результат? – zx485
Привет, спасибо за ваши комментарии. Я применяю таблицу стилей к фрагменту XML. Полный XML слишком большой для публикации. Часть XML, которую я опубликовал, будет производить только две строки ожидаемого вывода (в отладчике). Я не могу разобраться, как сортировать атрибуты, которые я перечислял. Все, что я пробовал (см. Комментарии в таблице стилей), не сортирует вывод. возможно, мне нужно разместить больше XML. есть ли способ прикрепить файл? – Judith