2

私は XSLT スタイル シートを初めて使用します。私は彼らといくつかの非常に基本的な作業を行い、今では私の能力をテストするプロジェクトを手に入れました. 私は正しい方法で質問しているとは思いません。

以下は、私が扱っているデータを表す XML データのセットです。そのナンセンスなデータ...

<?xml version="1.0" encoding="utf-8"?>
<catalog_new>
    <catalog_old>
        <catalog_newold>
            <final>
                <cd_info title="Empire Burlesque" artist="Dylan" />
                <store name="BestBuy" />
                    <sales thismonth="500"/>
                    <returns thismonth="10"/>
                <store name="Target" />
                    <sales thismonth="500"/>
                    <returns thismonth="10"/>
            </final>
            <final>
                <cd_info title="Stand" artist="REM" />
                <store name="BestBuy" />
                    <sales thismonth="1000"/>
                    <returns thismonth="20"/>
                <store name="Target" />
                    <sales thismonth="530"/>
                    <returns thismonth="50"/>
            </final>
        </catalog_newold>
    </catalog_old>
  </catalog_new>

私がしなければならないことは、各 final/cd_info 項目を選択し、名前 = Best Buy であるストア レコードを選択し、売上と返品のそれぞれについて今月の値を選択することです。

次のようなテーブルを作成しようとしています。

CDName          Artist          Store           SalesThisMonth    Returns
Stand           R.E.M           Best Buy           500              10

これは私が得た場所です:

<?xml version="1.0" encoding="iso-8859-1"?>
<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" encoding = "utf-8"   standalone = "yes"/>

  <xsl:template match="/">

    <html>
      <head>
        <meta charset="utf-8" />
        <title></title>
      </head>
      <body>

        <table border="1" style="width: 100%;">
          <tr>
            <th>Albumn Name</th>
            <th>Artist</th>
            <th>Store</th>
          </tr>

          <xsl:for-each select ="//catalog_new">
            <xsl:for-each select="catalog_old">
              <xsl:for-each select="catalog_newold">
                <xsl:for-each select="final">
                  <xsl:for-each select="cd_info">
                    <tr>
                      <td>
                        <xsl:value-of  select="@title"/>
                      </td>
                      <td>
                        <xsl:value-of select="@artist"/>
                      </td>
                    </tr>
                  </xsl:for-each>
                </xsl:for-each>
              </xsl:for-each>
            </xsl:for-each>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

私は行ったすべての試みを削除してしまいました.....私は道から外れているだけですか、それとも正しい道を進んでいますか?

前もって感謝します。

4

2 に答える 2

2

これはどうですか:

<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" encoding="utf-8" standalone = "yes"/>
  <xsl:variable name="storeMapNf">
    <map from="BestBuy" to="Best Buy" />
  </xsl:variable>
  <xsl:variable name="storeMapping" select="msxsl:node-set($storeMapNf)/*" />

  <xsl:template match="/">

    <html>
      <head>
        <meta charset="utf-8" />
        <title></title>
      </head>
      <body>

        <table border="1" style="width: 100%;">
          <tr>
            <th>Albumn Name</th>
            <th>Artist</th>
            <th>Store</th>
            <th>SalesThisMonth</th>
            <th>Returns</th>
          </tr>

          <xsl:apply-templates select="//final/store[@name = 'BestBuy']" />
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="final/store">
    <xsl:variable name="cdi" select="../cd_info" />
    <xsl:variable name="storeMap"
                  select="$storeMapping[@from = current()/@name]" />
    <tr>
      <td>
        <xsl:value-of select="$cdi/@title" />
      </td>
      <td>
        <xsl:value-of select="$cdi/@artist" />
      </td>
      <td>
        <xsl:value-of select="$storeMap/@to |
                                @store[not($storeMap)]"/>
      </td>
      <td>
        <xsl:value-of select="following-sibling::sales/@thismonth"/>
      </td>
      <td>
        <xsl:value-of select="following-sibling::returns/@thismonth"/>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、結果は次のようになります。

<html>
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <table border="1" style="width: 100%;">
      <tr>
        <th>Albumn Name</th>
        <th>Artist</th>
        <th>Store</th>
        <th>SalesThisMonth</th>
        <th>Returns</th>
      </tr>
      <tr>
        <td>Empire Burlesque</td>
        <td>Dylan</td>
        <td>Best Buy</td>
        <td>500</td>
        <td>10</td>
      </tr>
      <tr>
        <td>Stand</td>
        <td>REM</td>
        <td>Best Buy</td>
        <td>1000</td>
        <td>20</td>
      </tr>
    </table>
  </body>
</html>
于 2013-04-25T01:19:12.090 に答える
0

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
    <html>
      <head>
        <meta charset="utf-8" />
        <title></title>
      </head>
      <body>

        <table border="1" style="width: 100%;">
          <tr>
            <th>Albumn Name</th>
            <th>Artist</th>
            <th>Store</th>
            <th>SalesThisMonth</th>
            <th>Returns</th>
          </tr>
          <xsl:apply-templates/>
        </table>
     </body>
    </html>
 </xsl:template>

 <xsl:template match="store[@name='BestBuy']">
  <tr>
    <xsl:apply-templates select=
     "@name| ../cd_info/@* | following-sibling::*[not(position()>2)]/@thismonth"/>
  </tr>
 </xsl:template>

 <xsl:template match="@*">
  <td><xsl:value-of select="."/></td>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<catalog_new>
    <catalog_old>
        <catalog_newold>
            <final>
                <cd_info title="Empire Burlesque" artist="Dylan" />
                <store name="BestBuy" />
                <sales thismonth="500"/>
                <returns thismonth="10"/>
                <store name="Target" />
                <sales thismonth="500"/>
                <returns thismonth="10"/>
            </final>
            <final>
                <cd_info title="Stand" artist="REM" />
                <store name="BestBuy" />
                <sales thismonth="1000"/>
                <returns thismonth="20"/>
                <store name="Target" />
                <sales thismonth="530"/>
                <returns thismonth="50"/>
            </final>
        </catalog_newold>
    </catalog_old>
</catalog_new>

必要な正しい結果が生成されます。

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

      <meta charset="utf-8">
      <title></title>
   </head>
   <body>
      <table border="1" style="width: 100%;">
         <tr>
            <th>Albumn Name</th>
            <th>Artist</th>
            <th>Store</th>
            <th>SalesThisMonth</th>
            <th>Returns</th>
         </tr>
         <tr>
            <td>Empire Burlesque</td>
            <td>Dylan</td>
            <td>BestBuy</td>
            <td>500</td>
            <td>10</td>
         </tr>
         <tr>
            <td>Stand</td>
            <td>REM</td>
            <td>BestBuy</td>
            <td>1000</td>
            <td>20</td>
         </tr>
      </table>
   </body>
</html>
于 2013-04-25T03:16:03.400 に答える