2016-12-22 12 views
0

У меня есть это (упрощенный) 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 
+0

Привет, добро пожаловать в переполнение стека. Попробуйте опубликовать свой код, чтобы мы могли вам помочь ;-) –

+0

Как выглядит ваш желаемый результат? – zx485

+0

Привет, спасибо за ваши комментарии. Я применяю таблицу стилей к фрагменту XML. Полный XML слишком большой для публикации. Часть XML, которую я опубликовал, будет производить только две строки ожидаемого вывода (в отладчике). Я не могу разобраться, как сортировать атрибуты, которые я перечислял. Все, что я пробовал (см. Комментарии в таблице стилей), не сортирует вывод. возможно, мне нужно разместить больше XML. есть ли способ прикрепить файл? – Judith

ответ

0

Несколько ключей поможет вам построить пути к вашему рода атрибуты:

<!-- Map from @resultid to EVENT --> 
<xsl:key name="result-event" match="//EVENT" use="descendant::RANKING/@resultid"/> 
<!-- Map from @resultid to RANKING --> 
<xsl:key name="ranking" match="//RANKING" use="@resultid"/> 

Затем, когда шаблонирования элементы РЕЗУЛЬТАТ для атлета, вы можете ссылаться на вид атрибуты:

<xsl:template match="/"> 
    <xsl:apply-templates select="//ATHLETE"/> 
</xsl:template> 

<xsl:template match="ATHLETE"> 
    <xsl:apply-templates select="RESULTS/RESULT"> 
     <xsl:sort select="key('result-event', @resultid)/SWIMSTYLE/@stroke"/> 
     <xsl:sort select="key('result-event', @resultid)/SWIMSTYLE/@distance" data-type="number"/> 
     <xsl:sort select="key('result-event', @resultid)/@round"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="RESULT"> 
    <xsl:value-of select="key('ranking', @resultid)/@place"/> 
    <xsl:apply-templates select="key('result-event', @resultid)"/> 
    <xsl:value-of select="@swimtime"/> 
    <br/> 
</xsl:template> 

<xsl:template match="EVENT"> 
    <xsl:text> </xsl:text><xsl:value-of select="@round"/> 
    <xsl:text> </xsl:text><xsl:value-of select="SWIMSTYLE/@name" /> 
    <xsl:text> </xsl:text><xsl:value-of select="../../@number" /> 
</xsl:template> 

вы можете изменить порядок сортировки для патронов с помощью таблицы поиска для сопоставления @round ключа к произвольному суррогату ключ.

+0

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

+0

Если вы чувствуете, что ответ адекватно решает ваш вопрос, вы можете [принять его] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), нажав галочку рядом с счет. Это также наделяет воображаемые интернет-точки. – teppic

+0

Спасибо за руль. Я принял ваш ответ. – Judith

 Смежные вопросы

  • Нет связанных вопросов^_^