cpfp
cpfp

Reputation: 397

XSL compare ids

can you tell me why it doesnt work? Im a newbie at xsl....

xsl:

<ol id="presents">
<xsl:for-each select="tns:meeting/tns:jobs/tns:ausents/tns:ausent-member">
<li id="ausent"><a HREF="#jobs"><b><xsl:value-of select="tns:meeting/tns:members/tns:member[@member_id = current()/@member_id]/@name"/></b></a></li>
</xsl:for-each>
</ol>

xml Example:

<tns:meeting data="2001-01-01" local="Porto" organization="FCUP" type="ordinária" xmlns:tns="http://www.example.org/meeting" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/meeting meeting.xsd ">
  <tns:members> 
      <tns:member name="João" member_id="i1" title="account manager"></tns:member>
      <tns:member name="Carlos" member_id="i2" title="director geral"></tns:member>
      <tns:member name="José" member_id="i3" title="colaborador"></tns:member>
      <tns:member name="Joana" member_id="i4" title="secretária"></tns:member>
      <tns:member name="Carolina" member_id="i5" title="tesoureira"></tns:member>
      <tns:member name="Pedro" member_id="i6" title="colaborador"></tns:member>
      <tns:member name="Ivo" member_id="i7" title="presidente AE"></tns:member>
      <tns:member name="Luis" member_id="i8" title="vice-presidente AE"></tns:member>
  </tns:members>
<tns:jobs> <!-- Possibilidade de colocar o atributo nome no trabalho -->
        <tns:ausents>
            <tns:ausent-member member_id="i1">
                <tns:justification>Problemas pessoais</tns:justification>   
            </tns:ausent-member>
            <tns:ausent-member member_id="i2">
                <tns:justification>Problemas pessoais</tns:justification>   
            </tns:ausent-member>
        </tns:ausents>

The step

"tns:meeting/tns:members/tns:member[@member_id = current()/@member_id]">"

is not working and i cant find the problem....

Upvotes: 0

Views: 83

Answers (2)

Tim C
Tim C

Reputation: 70648

It is because of this expression...

<xsl:value-of select="tns:meeting/tns:members/tns:member[@member_id = current()/@member_id]/@name">

At this point, you are in an xsl:for-each, positioned on a tns:ausent-member element, but your xsl:value-of is a relative expression. It is relative to the element you are postioned on, and so is looking for a child element called tns:meeting.

You need to make it an absolute expression

<xsl:value-of select="/tns:meeting/tns:members/tns:member[@member_id = current()/@member_id]/@name">

The forward slash at the start means it will start off at the document node, which is what you want.

However, when looking up elements in this way, it is sometimes better to define a key

 <xsl:key name="member" match="tns:member" use="@member_id" />

Then you can look up the elements like so:

<xsl:value-of select="key('member', @member_id)/@name"/>

Try this XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="http://www.example.org/meeting">
  <xsl:output omit-xml-declaration="yes" indent="yes" />
  <xsl:key name="member" match="tns:member" use="@member_id" />

  <xsl:template match="/">
     <ol id="presents">
         <xsl:for-each select="tns:meeting/tns:jobs/tns:ausents/tns:ausent-member">
             <li id="ausent"><a HREF="#jobs"><b>
                  <xsl:value-of select="key('member', @member_id)/@name"/>
             </b></a></li>
        </xsl:for-each>
     </ol>
   </xsl:template>
</xsl:stylesheet>

Upvotes: 3

Martin Honnen
Martin Honnen

Reputation: 167736

Well the tns:members and tns:jobs are siblings. Inside the xsl:for-each select="tns:meeting/tns:jobs/tns:ausents/tns:ausent-member" the context node is an tns:ausent-member so you need to go up to

<xsl:value-of select="ancestor::tns:meeting/tns:members/tns:member[@member_id = current()/@member_id]/@name"> 

Upvotes: 2

Related Questions