如何使用xpath检查整个树的特定值

时间:2013-08-07 02:36:22

标签: xml xslt xpath axes

我正在使用营销平台来实施航空公司确认消息。该平台允许我们编写xsl来循环从数据库返回的值。我想要做的是检查整个路径

/消息/道具/ bookingcontact_to_booking / passenger_to_bookings / passenger_to_booking / passseg_to_passengers / passseg_to_passenger / passsegfee_to_passengersegments / passsegfee_to_passengersegment /

查看最终表“passsegfee”中的任何元素是否具有特定值的节点。如果没有,那么我想显示“无”,就是这样。如果有任何值,我想循环只显示那些元素。我为没有看到xml结构而道歉,但我的xsl在这一部分如下。

         

    <xsl:for-each select="/Msg/Props/bookingcontact_to_booking/passenger_to_bookings/passenger_to_booking">
        <tr id="Pax-DataRow">
            <td height="22" width="200">
                <xsl:value-of select="Prop[@prop_name = 'firstname']/@val" />&#160;<xsl:value-of select="Prop[@prop_name = 'lastname']/@val" />
            </td>
            <td>
                <xsl:choose>
                    <xsl:when test="passseg_to_passengers/passseg_to_passenger/passsegfee_to_passengersegments/passsegfee_to_passengersegment/Prop[@prop_name = 'feetype']/@val != 'SSR'">
                        None
                    </xsl:when>
                    <xsl:otherwise>                     
                        <table style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px; color: rgb(51, 51, 51);" >
                            <xsl:for-each select="passseg_to_passengers/passseg_to_passenger">
                                <xsl:for-each select="passsegfee_to_passengersegments/passsegfee_to_passengersegment">                          
                                    <xsl:if test="Prop[@prop_name = 'feetype']/@val = 'SSR'">
                                        <tr>
                                            <td align="left">
                                                <xsl:value-of select="Prop[@prop_name = 'feedescription']/@val" /><br/>
                                            </td>
                                        </tr>
                                    </xsl:if>
                                </xsl:for-each>
                            </xsl:for-each>
                        </table>
                    </xsl:otherwise>
                </xsl:choose>
            </td>
            <td>
                <xsl:value-of select="Prop[@prop_name = 'fsnumber']/@val" />
            </td>
        </tr>
        <xsl:if test="Prop[@prop_name = 'infantname']/@val != ''">
            <tr id="Pax-DataRow">
                <td height="22">                    
                    <xsl:value-of select="Prop[@prop_name = 'infantname']/@val" />
                </td>
                <td>
                    Infant
                </td>
                <td></td>
            </tr>
        </xsl:if>
    </xsl:for-each>

</xsl:template>

我不确定我是否能够像后代或祖先一样使用xpath轴来实现类似的功能,但是当我在营销平台上运行它时,即使它不应该显示“无”。

1 个答案:

答案 0 :(得分:1)

好吧,不确定这是否能解决问题,但这条路径存在问题:

passseg_to_passengers/passseg_to_passenger/passsegfee_to_passengersegments
      /passsegfee_to_passengersegment/Prop[@prop_name = 'feetype']/@val != 'SSR'

如果任何脚型不等于“SSR”,则会生成true。要检查是否缺少值,可以执行以下操作:

not(passseg_to_passengers/passseg_to_passenger/passsegfee_to_passengersegments
      /passsegfee_to_passengersegment/Prop[@prop_name = 'feetype']/@val = 'SSR')