2

私はXSLを初めて使用し、少し複雑なことをしようとして、助けを求めています。

XMLがどのように見えるかの例を次に示します。

<foo>
  <customers>
    <customer>
      <title>Ms</title>
      <name>
        <firstName>Jane</firstName>
        <lastName>Customer</lastName>
      </name>
      <reservations>
        <reseration>
          <reservationNumber>123</reservationNumber>
          <reservationDate>2013-02-15</reservationDate>
          <table>12</table
        </reservation>
        <reseration>
          <reservationNumber>456</reservationNumber>
          <reservationDate>2013-03-24</reservationDate>
          <table>09</table
        </reservation>
        <reseration>
          <reservationNumber>789</reservationNumber>
          <reservationDate>2013-05-02</reservationDate>
          <table>22</table
        </reservation>
      </reservations>
    </customer>
    <customer>
      <title>Dr</title>
      <name>
        <firstName>John</firstName>
        <lastName>Smith</lastName>
      </name>
      <reservations>
        <reseration>
          <reservationNumber>ABC</reservationNumber>
          <reservationDate>2013-02-15</reservationDate>
          <table>05</table
        </reservation>
        <reseration>
          <reservationNumber>DEF</reservationNumber>
          <reservationDate>2013-03-24</reservationDate>
          <table>10</table
        </reservation>
        <reseration>
          <reservationNumber>GHI</reservationNumber>
          <reservationDate>2013-05-02</reservationDate>
          <table>16</table
        </reservation>
      </reservations>
    </customer>
  </customers>
</foo>

結果のテーブルは次のようになります。

Title     Name              Reservation     Date           Table
-----     ----              -----------     ----           -----
Ms        Jane Customer     123             2013-02-15     12
                            456             2013-03-24     09
                            789             2013-05-02     22
Dr        John Smith        ABC             2013-02-15     05
                            DEF             2013-03-24     10
                            GHI             2013-05-02     16

XSL for-eachを使用してこの方法でテーブルを作成し、各行を作成する方法を知っています。これについて注意が必要なのは、予約の詳細(予約、日付、テーブル)を最初の子要素から最初の行の親と同じ行にプルする再帰を作成する方法です。次に、残りの行の残りの子要素の予約の詳細のみ。

したがって、この:

Title     Name              Reservation     Date           Table
-----     ----              -----------     ----           -----
Ms        Jane Customer     123             2013-02-15     12
                            456             2013-03-24     09
                            789             2013-05-02     22

これではない:

Title     Name              Reservation     Date           Table
-----     ----              -----------     ----           -----
Ms        Jane Customer     
                            123             2013-02-15     12
                            456             2013-03-24     09
                            789             2013-05-02     22

多くの検索を行いましたが、そのようなものはまったく見つかりませんでした。

アップデート

これが私が仕事に就くことができたものです

<xsl:for-each select="customers/customer">
  <xsl:for-each select="./reservations/reservation">
    <xsl:choose>
      <xsl:when test="position() = 1"> 
        <tr>
          <td><xsl:value-of select="../../title"/></td> 
          <td><xsl:value-of select="reservationNumber"/></td>
        </tr>
      </xsl:when>
      ....
4

2 に答える 2

2

最も簡単な方法は、おそらく要素のみを照合することです。reservation

それぞれについて、それぞれがその親の最初の子であるかどうかをテストするためにreservation使用できます。<xsl:when test="node[position() > 1]">そうである場合は、parent軸を使用してcustomer詳細を取得できます。それ以外の場合は、ブランクで埋めることができます。

于 2012-11-30T21:11:39.480 に答える
0

タイトルと名前を複数の行にまたがらせたい場合は、このcount()関数を使用して予約の数を調べることができます。

最初の予約は同じテーブル行にあるため、最初の予約を他の予約とは異なる方法で処理する必要があります。

次のフラグメントは、アイデアを示しています。

  <xsl:template match="customer">
    <xsl:variable name="res" select="reservations/reservation"/>
    <tr>
      <td rowspan="{count($res)}"><xsl:value-of select="title"/></td>
      <td rowspan="{count($res)}"><xsl:apply-templates select="name"/></td>
      <!-- the first reservation goes to the same row -->
      <xsl:apply-templates select="$res[1]"/>
    </tr>
    <!-- the rest of the reservations go to their own rows -->
    <xsl:for-each select="$res[position() &gt; 1]">
      <tr>
        <xsl:apply-templates select="."/>
      </tr>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="name">
    <xsl:value-of select="concat(firstName, ' ', lastName)"/>
  </xsl:template>

  <xsl:template match="reservation">
    <td><xsl:value-of select="reservationNumber"/></td>
    <td><xsl:value-of select="reservationDate"/></td>
    <td><xsl:value-of select="table"/></td>
  </xsl:template>
于 2012-11-30T21:16:32.807 に答える