【问题标题】:XSLT - Accessing outer element with inner loop of nested for-each loopXSLT - 使用嵌套 for-each 循环的内部循环访问外部元素
【发布时间】:2014-12-05 20:18:02
【问题描述】:

我是 XSLT 的新手,遇到一个问题,需要我访问内部循环中嵌套 for-each 的外部循环中元素的值。我的 XML 如下所示

<searchresults>
    <journeygroup>
        <journeygroupnum>1</journeygroupnum>
        <journeydetails>
            <flightsegments>1</flightsegments>
            <journeyid>1</journeyid>
            <currency>USD</currency>
            <fare>399.00</fare>
            <taxes>99.00</taxes>
            <flights>
                <segmentid>1</segmentid>
                <legid>1</legid>
                <marketingcarrier>DL</marketingcarrier>
                <operatingcarrier>DL</operatingcarrier>
                <flightnum>9695</flightnum> 
            </flights>
        </journeydetails>
        <journeydetails>
            <flightsegments>1</flightsegments>
            <journeyid>2</journeyid>
            <currency>USD</currency>
            <fare>459.00</fare>
            <taxes>129.00</taxes>
            <flights>
                <segmentid>1</segmentid>
                <legid>1</legid>
                <marketingcarrier>AA</marketingcarrier>
                <operatingcarrier>AA</operatingcarrier>
                <flightnum>5070</flightnum> 
            </flights>
        </journeydetails>
    </journeygroup>
</searchresults>

我的 XSLT 文档的摘录如下所示

<table>
<xsl:for-each select="searchresults/journeygroup/journeydetails">       
    <xsl:for-each select="flights[segmentid='1']">
    <tr>
        <td><xsl:value-of select="marketingcarrier"/></td>
        <td><xsl:value-of select="operatingcarrier"/></td>
        <td><xsl:value-of select="flightnum"/></td>

        <!-- Here I would like to add columns with the currency and fare from the outer loop -->
        <td>currency</td>
        <td>fare</td>
    </tr>
    </xsl:for-each>
</xsl:for-each>
<table>

如何从内部 for-each 循环访问外部循环中 currencyfare 节点的值。

【问题讨论】:

标签: xml xslt


【解决方案1】:

可以相对访问父级:

<xsl:value-of select="../currency"/>

或者用变量捕获外循环当前节点,然后在里面访问:

<table>
  <xsl:for-each select="searchresults/journeygroup/journeydetails">
    <xsl:variable name="journeyDetails" select="."/>
    <xsl:for-each select="flights[segmentid='1']">
      <tr>
        <td><xsl:value-of select="marketingcarrier"/></td>
        <td><xsl:value-of select="operatingcarrier"/></td>
        <td><xsl:value-of select="flightnum"/></td>

        <!-- Here I would like to add columns with the 
             currency and fare from the outer loop -->
        <td><xsl:value-of select="$journeyDetails/currency"/></td>
        <td><xsl:value-of select="$journeyDetails/fare"/></td>
      </tr>
    </xsl:for-each>
  </xsl:for-each>
</table>

【讨论】:

  • 感谢您的两个建议。这些选项中的任何一个都比另一个更好吗?
  • 相对路径对于这个简单的案例来说更加简洁和精细。如果命名得当并且在更复杂的情况下上下文不太清楚时,定义一个单独的变量会更容易理解。
【解决方案2】:

使用父轴,也就是 .. 运算符。

<table>
<xsl:for-each select="searchresults/journeygroup/journeydetails">       
<xsl:for-each select="flights[segmentid='1']">
<tr>
    <td><xsl:value-of select="marketingcarrier"/></td>
    <td><xsl:value-of select="operatingcarrier"/></td>
    <td><xsl:value-of select="flightnum"/></td>

    <!-- Here I would like to add columns with the currency and fare from the outer loop -->
    <td><xsl:value-of select="../currency"/></td>
    <td><xsl:value-of select="../fare"/></td>
</tr>
</xsl:for-each>
</xsl:for-each>
<table>

【讨论】:

    【解决方案3】:

    使用&lt;xsl:value-of select="../currency"/&gt;向上导航。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      相关资源
      最近更新 更多