【问题标题】:Grouping elements by attribute of multiple identical childs in xslt 1.0在 xslt 1.0 中按多个相同子项的属性对元素进行分组
【发布时间】:2014-04-25 17:36:24
【问题描述】:

我有一个如下所示的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Itineraries>
  <Itinerary>
    <Details>
      <FlightSegment DepartureDateTime="2014-05-02T14:24:00" ArrivalDateTime="2014-05-02T15:42:00" FlightNumber="5214">
        <DepartureAirport LocationCode="JFK" />
        <ArrivalAirport LocationCode="IAD" />
        <OperatingAirline Code="UA">
          </FlightSegment>
      <FlightSegment DepartureDateTime="2014-05-02T16:24:00" ArrivalDateTime="2014-05-02T17:42:00" FlightNumber="54">
        <DepartureAirport LocationCode="IAD" />
        <ArrivalAirport LocationCode="MEX" />
        <OperatingAirline Code="UA">
          </FlightSegment>
    </Details>
    <Price>
      <Base BasePr="250">
        <Total TotalPr="320">
          <Price>
       </Itinerary>
  <Itinerary>
    <Details>
      <FlightSegment DepartureDateTime="2014-06-02T14:24:00" ArrivalDateTime="2014-06-02T15:42:00" FlightNumber="725">
        <DepartureAirport LocationCode="JFK" />
        <ArrivalAirport LocationCode="IAD" />
        <OperatingAirline Code="UA">
          </FlightSegment>
      <FlightSegment DepartureDateTime="2014-06-02T16:24:00" ArrivalDateTime="2014-06-02T17:42:00" FlightNumber="245">
        <DepartureAirport LocationCode="IAD" />
        <ArrivalAirport LocationCode="MEX" />
        <OperatingAirline Code="UA">
          </FlightSegment>
    </Details>
    <Price>
      <Base BasePr="240">
        <Total TotalPr="310">
          <Price>
            <Itinerary>
              <Details>
                <FlightSegment DepartureDateTime="2014-06-02T14:24:00" ArrivalDateTime="2014-06-02T15:42:00" FlightNumber="5124">
                  <DepartureAirport LocationCode="JFK" />
                  <ArrivalAirport LocationCode="IAD" />
                  <OperatingAirline Code="UA">
          </FlightSegment>
                <FlightSegment DepartureDateTime="2014-06-02T16:24:00" ArrivalDateTime="2014-06-02T17:42:00" FlightNumber="54">
                  <DepartureAirport LocationCode="IAD" />
                  <ArrivalAirport LocationCode="MEX" />
                  <OperatingAirline Code="UA">
          </FlightSegment>
              </Details>
              <Price>
                <Base BasePr="230">
                  <Total TotalPr="300">
                    <Price>
       </Itinerary>
            <Itinerary>
              <Details>
                <FlightSegment DepartureDateTime="2014-05-02T14:24:00" ArrivalDateTime="2014-05-02T15:42:00" FlightNumber="725">
                  <DepartureAirport LocationCode="JFK" />
                  <ArrivalAirport LocationCode="IAD" />
                  <OperatingAirline Code="UA">
          </FlightSegment>
                <FlightSegment DepartureDateTime="2014-05-02T16:24:00" ArrivalDateTime="2014-05-02T17:42:00" FlightNumber="245">
                  <DepartureAirport LocationCode="IAD" />
                  <ArrivalAirport LocationCode="MEX" />
                  <OperatingAirline Code="UA">
          </FlightSegment>
              </Details>
              <Price>
                <Base BasePr="220">
                  <Total TotalPr="290">
                    <Price>
       </Itinerary>
          </Itineraries>

我需要创建一个 xslt,将共享其航段航班号的“行程”节点分组。

最终,我需要以下 html 输出:

<table>
  <table>
    <tr>
      <td>
        Flight: 5124
      </td>
      <td>
        JFK - IAD
      </td>
    </tr>
    <tr>
      <td>
        Airline: UA
      </td>
    </tr>
    <tr>
      <td>
        Departure: 14:24
      </td>
      <td>
        Arrival: 15:42
      </td>
    </tr>
    <tr>
      <td>
        Flight: 54
      </td>
      <td>
        IAD - MEX
      </td>
    </tr>
    <tr>
      <td>
        Airline: UA
      </td>
    </tr>
    <tr>
      <td>
        Departure: 16:24
      </td>
      <td>
        Arrival: 17:42
      </td>
    </tr>
  </table>
  <table>
    <tr>
      <td>
        <table>
          <tr>
            <td>2014-05-02</td>
          </tr>
          <tr>
            <td>Base</td>
            <td>250</td>
          </tr>
          <tr>
            <td>Total</td>
            <td>320</td>
          </tr>
        </table>
        <table>
          <tr>
            <td>2014-06-02</td>
          </tr>
          <tr>
            <td>Base</td>
            <td>230</td>
          </tr>
          <tr>
            <td>Total</td>
            <td>300</td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
  <table>
    <tr>
      <td>
        Flight: 725
      </td>
      <td>
        JFK - IAD
      </td>
    </tr>
    <tr>
      <td>
        Airline: UA
      </td>
    </tr>
    <tr>
      <td>
        Departure: 14:24
      </td>
      <td>
        Arrival: 15:42
      </td>
    </tr>
    <tr>
      <td>
        Flight: 245
      </td>
      <td>
        IAD - MEX
      </td>
    </tr>
    <tr>
      <td>
        Airline: UA
      </td>
    </tr>
    <tr>
      <td>
        Departure: 16:24
      </td>
      <td>
        Arrival: 17:42
      </td>
    </tr>
  </table>
  <table>
    <tr>
      <td>
        <table>
          <tr>
            <td>2014-05-02</td>
          </tr>
          <tr>
            <td>Base</td>
            <td>220</td>
          </tr>
          <tr>
            <td>Total</td>
            <td>290</td>
          </tr>
        </table>
        <table>
          <tr>
            <td>2014-06-02</td>
          </tr>
          <tr>
            <td>Base</td>
            <td>240</td>
          </tr>
          <tr>
            <td>Total</td>
            <td>310</td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
</table>

但就目前而言,我已经做到了:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="yes"/>
  <xsl:key name="groups" match="Itinerary" use="./Details/FlightSegment/@FlightNumber"/>
  <xsl:template match="/">

    <table>
      <tr>
        <td>
          <xsl:for-each select="/Itineraries/Itinerary[generate-id() = generate-id(key('groups', Itinerary)[1])]">
            <table>
              <tr>
                <td>
                  <xsl:value-of select="@FlightNumber"/>
                  <td>
 </tr>
            </table>
          </xsl:for-each>
        </td>
      </tr>
    </table>
  </xsl:template>

</xsl:stylesheet> 

但是我的密钥一定有问题,因为我得到一个空结果,只是第一个空表,但是调试器没有显示任何编译错误或我的代码有问题。

我一直在寻找 muenchian 分组和复合键的不同方法,但我找不到解决方案。我什至不知道为什么我的密钥不起作用,所以您能给我的任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 我应该注意到我的原始 xml 比这更复杂,但这些是我必须使用的基本值。

标签: xml xslt muenchian-grouping compound-key


【解决方案1】:

坦率地说,输入样本和 XSLT 样本的格式都不是很好,所以很难想象你能得到任何输出。

但鉴于&lt;xsl:key name="groups" match="Itinerary" use="./Details/FlightSegment/@FlightNumber"/&gt;,通常的方法是使用

<xsl:for-each select="/Itineraries/Itinerary[generate-id() = generate-id(key('groups', Details/FlightSegment/@FlightNumber)[1])]">

【讨论】:

  • 我之前的评论是错误的。我对代码进行了一些操作,您的解决方案有效。谢谢。现在我可以继续研究结构了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2023-02-10
  • 2017-11-06
相关资源
最近更新 更多