在我的XML文档中,每个潜在客户或乘客都有一个pickup
和dropoff
属性,该属性具有匹配的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>
如何为XSL中的每位潜在客户或乘客选择a:place
?例如:
<xsl:for-each select="r:lead">
Route: <pickup goes here/> → <dropoff goes here/>
</xsl:for-each>
预期结果:
路线:大厅→公寓
<xsl:for-each select="r:passengers/r:passenger">
Route: <pickup goes here/> → <dropoff goes here/>
</xsl:for-each>
预期结果:
路线:大厅→火车站
答案 0 :(得分:1)
要遵循交叉引用,您可以定义和使用密钥,使用
定义密钥<xsl:key name="by-id" match="r:waypoints/r:waypoint/a:place" use="../@id"/>
然后你可以使用例如。
<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>
由于id
在您的完整文档中似乎不是唯一的,因此需要更多代码,在XSLT 2.0中,您可以使用<xsl:value-of select="key('by-id', @pickup, ancestor::r:ride)"/>
。
使用XSLT 1.0将密钥定义更改为
<xsl:key name="by-id" match="r:waypoints/r:waypoint/a:place" use="concat(generate-id(ancestor::r:ride), '|', ../@id)"/>
然后密钥用于例如key('by-id', concat(generate-id(ancestor::r:ride), '|', @pickup))
等等。