基于属性值的访问节点

时间:2015-04-26 10:21:40

标签: xml xslt

在我的XML文档中,每个潜在客户或乘客都有一个pickupdropoff属性,该属性具有匹配的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/> &#8594; <dropoff goes here/>                                     
</xsl:for-each>

预期结果:

路线:大厅→公寓

<xsl:for-each select="r:passengers/r:passenger">
    Route: <pickup goes here/> &#8594; <dropoff goes here/>                                     
</xsl:for-each>

预期结果:

路线:大厅→火车站

1 个答案:

答案 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)"/> &#8594; <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))等等。