【问题标题】:How to use xpath to check entire tree for specific value如何使用 xpath 检查整个树的特定值
【发布时间】:2013-08-08 06:11:43
【问题描述】:

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

/Msg/Props/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 轴来实现类似的东西,但是当我在营销平台上运行它时,即使它不应该显示“无”。

【问题讨论】:

    标签: xml xslt xpath axes


    【解决方案1】:

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

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

    如果 any 费用类型不等于“SSR”,这将产生 true。要检查是否缺少值,您可以这样做:

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

    【讨论】:

    • 我想我没想过那样尝试。让我试一试!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多