xml - Access node based on attribute value -
within xml document, each lead or passenger has pickup
, dropoff
attribute, has matching waypoint
id.
<r:rides> <r:ride> <r:lead pickup="1" dropoff="2"> </r:lead> <r:passengers> <r:passenger pickup="1" dropoff="3"> </r:passenger> </r:passengers> <r:waypoints> <r:waypoint id="1"> <a:place>hall</a:place> </r:waypoint> <r:waypoint id="2"> <a:place>apartments</a:place> </r:waypoint> <r:waypoint id="3"> <a:place>train station</a:place> </r:waypoint> </r:waypoints> </r:ride> </r:rides>
how select a:place
each lead or passenger in xsl? example:
<xsl:for-each select="r:lead"> route: <pickup goes here/> → <dropoff goes here/> </xsl:for-each>
expected outcome:
route: hall → apartments
<xsl:for-each select="r:passengers/r:passenger"> route: <pickup goes here/> → <dropoff goes here/> </xsl:for-each>
expected outcome:
route: hall → train station
to follow cross-references can define , use key, define key with
<xsl:key name="by-id" match="r:waypoints/r:waypoint/a:place" use="../@id"/>
then can use e.g.
<xsl:for-each select="r:lead"> route: <xsl:value-of select="key('by-id', @pickup)"/> → <xsl:value-of select="key('by-id', @dropoff)"/> </xsl:for-each>
as id
s don't seem unique in complete document more code needed, in xslt 2.0 use <xsl:value-of select="key('by-id', @pickup, ancestor::r:ride)"/>
.
with xslt 1.0 change key definition
<xsl:key name="by-id" match="r:waypoints/r:waypoint/a:place" use="concat(generate-id(ancestor::r:ride), '|', ../@id)"/>
and key uses e.g. key('by-id', concat(generate-id(ancestor::r:ride), '|', @pickup))
, on.
Comments
Post a Comment