XSLT проверяет значения в нескольких узлах

У меня есть следующий XML, который мне нужен для извлечения значения параметра на основе атрибута дочернего узла с помощью XSLT. В этом случае извлеките список действий, в которых участвуют мои ученики:

XML

<students>
   <student id="1000020001"/>  
   <student id="1000020002"/>      
</students>   
<activities>
    <activity name="yoga beginners" start="2016-10-12" end="2016-12-17">          
         <members>            
              <member id="1000020001"/>              
         </members>
    </activity>
    <activity name="yoga intermediate" start="2017-10-12" end="2017-12-17">          
         <members>            
              <member id="1000020001"/>  
              <member id="1000020002"/>            
         </members>
    </activity>
</activities>

Я хочу создать XSLT, в котором отображаются действия, в которых участвуют мои ученики, в этом случае у меня есть:

XSLT Для каждого учащегося:

<xsl:for-each select="/activities/activity">
   <b>Activity:</b>: 
   <xsl:call-template name="extractActivities">
      <xsl:with-param name="student-id" select="@id"/>
   </xsl:call-template>            
</xsl:for-each>

<xsl:template name="extractActivities">
    <xsl:param name="student-id"/>
    <xsl:if test="$student-id = /activities/activity/members/member/@id">
        <xsl:value-of select="@name"/>
    </xsl:if>
</xsl:template>

У меня есть следующие две проблемы:

  1. Первый XSLT отображает «Активность:» дважды, поскольку выполняет цикл для каждого узла.
  2. Название активности не отображается

person gogasca    schedule 18.10.2016    source источник
comment
Во-первых, ваш XML-код недействителен по двум причинам: открывающий тег ‹activities› не может иметь ведущую косую черту, и должен быть один корневой тег (содержащий элементы ‹students› и ‹activities›).   -  person jpvee    schedule 18.10.2016
comment
Опечатка спасибо за ответ только что исправил   -  person gogasca    schedule 18.10.2016


Ответы (1)


Лучше всего разрешать перекрестные ссылки с помощью ключа:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" />

<xsl:key name="act" match="activity" use="members/member/@id" />

<xsl:template match="/root">
    <html>
        <body>
            <xsl:for-each select="students/student">
                <h3>Student: <xsl:value-of select="@id" /></h3>
                <xsl:for-each select="key('act', @id)">
                    <b>Activity: </b><xsl:value-of select="@name" />
                    <br/>
                </xsl:for-each>
            </xsl:for-each>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>

Применяется к следующим правильным входным данным:

XML

<root>
   <students>
      <student id="1000020001"/>
      <student id="1000020002"/>
   </students>
   <activities>
      <activity name="yoga beginners" start="2016-10-12" end="2016-12-17">
         <members>
            <member id="1000020001"/>
         </members>
      </activity>
      <activity name="yoga intermediate" start="2017-10-12" end="2017-12-17">
         <members>
            <member id="1000020001"/>
            <member id="1000020002"/>
         </members>
      </activity>
   </activities>
</root>

результат будет:

<html>
<body>
<h3>Student: 1000020001</h3>
<b>Activity: </b>yoga beginners<br>
<b>Activity: </b>yoga intermediate<br>
<h3>Student: 1000020002</h3>
<b>Activity: </b>yoga intermediate<br>
</body>
</html>
person michael.hor257k    schedule 18.10.2016