2

ルートに移動して、それぞれの内部の他のノードにアクセスできないXSL変換を作成しています。

私が1つのコンテキスト内にいると仮定します。そこから値を取得して同じコンテキストに戻るために、外部ノードに移動する必要がある状況があります。

これが私のXMLファイルです。

    <xml version=1.0>

    <abc>
     <parts>
            <part pno="10506">
              <pname>Land Before Time I</pname>
              <qoh>200</qoh>
              <price>19.99</price>
              <level>20</level>
            </part>
            …
      </parts>
       <orders>
            <order ono="1022" takenBy="1001" customer="2222">
              <receivedDate>1995-02-13</receivedDate>
              <shippedDate>1995-02-20</shippedDate>
              <items>
                <item>
                  <partNumber>10601</partNumber>
                  <quantity>1</quantity>
                </item>
                <item>
                  <partNumber>10701</partNumber>
                  <quantity>1</quantity>
                </item>
              </items>
         </order>

     .....
     </orders>
    </abc>

xsl:for-eachの「item」タグ内で反復していますが、「part」タグ内に入り、値を取得して同じコンテキストに戻りたいと思います。

詳細については、テーブルを埋めています。私のテーブルには4つの列があります。

  • partname:名前を取得するために行く必要<part>があります。(これは私が立ち往生した場所です)
  • 数量:それはのサブ要素であるため、私にとっては問題ではありません<item>
  • 価格:私は同じ問題に直面しています。
  • 合計:簡単です。

パーツタグからパーツ名と価格の値を取得するのを手伝ってください。

次のコードは私には機能しません。

  <?xml version="1.0" encoding="UTF-8"?>

    <xsl:stylesheet>

        <table>
             <xsl:param name="param1" />

             <xsl:variable name="temp" select ="name(/*)"/>
               <xsl:for-each select=".//order[@ono=$param1]/items/item">
                     <tr>
          <td> <xsl:value-of select="$temp//part[@pno=partNumber]/pname"/>  </td>
          <td> <xsl:value-of select="quantity"/> </td>                                                       
          <td> <xsl:value-of select="$temp//part[@pno=partNumber]/price"/>  </td>
          <td> <xsl:value-of select="quantity*$temp//part[@pno=partNumber]/price"/>  </td>
                </tr>
            </xsl:for-each>
           </table>      




    <xsl:stylesheet>

グーグルを試しましたが、問題の正確な解決策を得ることができませんでした。私が書いたコードはいくつかのエラーをスローします。「temp」の選択値をroot(。)に変更してみましたが、機能しません。

ヒントが必要です。答えは必要ありません。ヒントだけで十分です。

私は過去5時間この問題で立ち往生しました。返信して助けてください。

4

2 に答える 2

2

述語内から現在のコンテキストに関連するものを参照する場合は、次を使用できますcurrent()

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:param name="param1" select="1022" />

  <xsl:template match="/">
    <table>
      <xsl:for-each select="//order[@ono=$param1]/items/item">
        <tr>
          <td>
            <xsl:value-of select="//part[@pno=current()/partNumber]/pname"/>
          </td>
          <td>
            <xsl:value-of select="quantity"/>
          </td>
          <td>
            <xsl:value-of select="//part[@pno=current()/partNumber]/price"/>
          </td>
          <td>
            <xsl:value-of select="quantity * //part[@pno=current()/partNumber]/price"/>
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

ただし、ここでのより効率的なアプローチは、キーを使用することです。また、テンプレートをより有効に活用し、パスでの繰り返しを避けるために、XSLTを少しクリーンアップしました。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:key name="kPart" match="part" use="@pno" />

  <xsl:param name="param1" select="1022" />

  <xsl:template match="/">
    <table>
      <xsl:apply-templates select="//order[@ono=$param1]/items/item" />
    </table>
  </xsl:template>

  <xsl:template match="item">
    <xsl:variable name="part" select="key('kPart', partNumber)" />
    <tr>
      <td>
        <xsl:value-of select="$part/pname"/>
      </td>
      <td>
        <xsl:value-of select="quantity"/>
      </td>
      <td>
        <xsl:value-of select="$part/price"/>
      </td>
      <td>
        <xsl:value-of select="quantity * $part/price"/>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>
于 2013-02-24T05:36:35.277 に答える
0

ルートはではありません.。ルートは/です。要素名が「part」のルートの子孫が必要な場合は、を使用します//part

<xsl:template match="/"><table>に置き、</xsl:template></table>に置くと、XMLパーサーがドキュメントルートを解析するときに、XSLプロセッサーがテーブル要素を生成します。

オープンxsl:stylesheetタグにはいくつかの属性が必要です。<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">XSLT1.0用である必要があります。

この少しの情報で、それを機能させるのに十分かもしれないと思います。

効率を改善する必要がある場合は、代わりに//使用する必要がありますxsl:key。の定義、基本、および簡単な例はxsl:key、XSL変換仕様にあります。

于 2013-02-24T04:20:50.577 に答える