• Tags , , , , , , ,         
  • 2017-11-26  15:47:09        
  • 32 °C    

    xsl:for-each的应用和对应的调用,遍历xml的元素和取值 。for-each是用来遍历xml里面的每一个值,这个是非常重要的,我们可以来看看下面的一些典型的用法:

    1. 取得每个element里面的特定值


    <Request>
    <OriginDestinationInformation>
    <ArrivalDateTime>2017-09-17TAny</ArrivalDateTime>
    <OriginLocation CodeContext="IATA" LocationCode="HK"/>
    <DestinationLocation CodeContext="IATA" LocationCode="Singapore"/>
    </OriginDestinationInformation>
    <OriginDestinationInformation>
    <DepartureDateTime>2017-09-20TAny</DepartureDateTime>
    <OriginLocation CodeContext="IATA" LocationCode="SIN"/>
    <DestinationLocation CodeContext="IATA" LocationCode="HKG"/>
    </OriginDestinationInformation>
    </Request>
    
    

    如果要遍历上面的xml,拿到里面的每个code,xslt应该写成下面这个样子,注意,variable不能写在for-each的外面,不然遍历的时候就总是拿到第一个的值:

    <xsl:for-each select="/Request/OriginDestinationInformation/DestinationLocation">
    <xsl:variable name="locationCode" select="@LocationCode"/>
    <xsl:variable name="locationCodeContext" select="@CodeContext"/>
    <Criterion ExactMatch="true">
    <EventRef Enabled="true" EventCityCode="{$locationCode}" EventCodeContext="{$locationCodeContext}"/>
    </Criterion>
    </xsl:for-each>
    
    

    之后的结果如下:

    <Criterion ExactMatch="true">
    <EventRef Enabled="true" EventCityCode="SIN" EventCodeContext="IATA"/>
    </Criterion>
    <Criterion ExactMatch="true">
    <EventRef Enabled="true" EventCityCode="HKG" EventCodeContext="IATA"/>
    </Criterion>
    
    

    2. 取得特定element里面的值


    如果xslt写成下面这样的话,那么,他就会取得第一个element里面的特定值

    <xsl:variable name="locationCode" select="/Request/OriginDestinationInformation[1]/DestinationLocation@LocationCode"/>
    
    

    3. for-each的定位以及在template的调用


    for-each在template里面,还是根据for-each select的节点为当前节点,下面是一个结合得很好的一个例子

    <xsl:template match="DescriptiveContent" mode="Breakyizhanxml">
    <xsl:param name="location"/>
    <xsl:if test="./@EventCityCode = $location">
    <event>
    <evtName>
    <xsl:value-of select="./@Name"/>
    </evtName>
    <evtCode>
    <xsl:value-of select="./@Code"/>
    </evtCode>
    <evtImgURL>
    <xsl:value-of select="./ImageItems/ImageItem[1]/ImageFormat/URL"/>
    </evtImgURL>
    </event>
    </xsl:if>
    <!--Match the Star Location Event associatedLocation code-->
    <xsl:for-each select="./Locations/Location">
    <!--for-each下面的属性都是在for-each select的节点开始选的,也就是说,下面的./@Code的全部路径是DescriptiveContent/Locations/Location/@Code-->
    <xsl:if test="./@Code = $location">
    <event>
    <evtName>
    <!--下面取的都是同一个节点的属性,都是DescriptiveContent/@Name的属性,../表示向上一级-->
    <xsl:value-of select="../../@Name"/>
    </evtName>
    <evtCode>
    <xsl:value-of select="../../@Code"/>
    </evtCode>
    <evtImgURL>
    <xsl:value-of select="../../ImageItems/ImageItem[1]/ImageFormat/URL"/>
    </evtImgURL>
    </event>
    </xsl:if>
    </xsl:for-each>
    </xsl:template>
    
    

    调用上面这个template的方法很简单

    <xsl:apply-templates match="DescriptiveContent" mode="Breakyizhanxml">
    <xsl:with-param name="location" select="'samplelocation'"/>
    </xsl:apply-templates>
    
    

    本文内容来自:xsl:for-each的应用和对应的调用,遍历xml的元素和取值 – Break易站


    ---Author: Arvin Chen ---Web Address: www.breakyizhan.com (Break易站)

     
    转载请保留页面地址:https://www.breakyizhan.com/xml/368.html