2016-04-13 24 views
1

私はXML/XSLTの新人であり、これまでにMeunchianグループで賢明なものを探してSOとW3SChoolsサイトを検索しています私のチャレンジに対する効果的な解決策を把握することができました。XMLをHTMLに変換する、同じ要素値の複数の構造から要素をフィルタリングする

本質的に私は、請求書発行情報を含むデータベースからエクスポートされた1つの大きなXMLファイル(XMLを直接編集することはできません)を持っています。

XSLT(1.0)を使用してHTMLにXMLの変換を適用したい(私はSaxonを使用しています)ので、各請求書が表として表示されます。ただし、XMLでは、同じ請求書に関連する製品ラインが多数あります(識別子として<invoiceNum>要素で示されます)。

&は、同じ請求書の一部である製品ラインごとに新しいテーブルを表示する必要はありません。私の現在のXSLファイルでは、複製された<invoiceNum>要素の最初のインスタンスのテーブルを作成し、連続する製品ライン(<ProductID><ProductName><ProductDescription>など)の固有の要素のみを追加し、複製された出荷情報。

XMLコードスニペットでは、XMLのレイアウトを確認できます。 XSLスニペットでは、テーブルをどのように構築しようとしているのか分かりました。 XMLファイル内の連続する<invoices_snet>インスタンスごとに、変換を介してテーブルに製品情報だけを追加したいとします。 <invoices_snet>要素のfor-eachを使用すると、毎回新しいテーブルが作成されます。

ここで条件付きロジックを使用する必要がありますか?<invoices_snet>要素の値の等価性を比較するには、テンプレートを使用しますか?

ご協力いただきありがとうございます。

<database> 
    <invoices> 
    <invoices_snet> 
    <invoiceNum NAME="invoiceNum" TYPE="SMALLINT">368</invoiceNum> 
    <ProductID NAME="ProductID" TYPE="VARCHAR">SS106</ProductID> 
    <ProductName NAME="ProductName" TYPE="VARCHAR">Senna Sunglasses</ProductName> 
    <ProductDescription NAME="ProductDescription" TYPE="VARCHAR">Lively sunglasses</ProductDescription> 
    <Quantity NAME="Quantity" TYPE="SMALLINT">34</Quantity> 
    <UnitPrice NAME="UnitPrice" TYPE="CURRENCY">40.0000</UnitPrice> 
    <ExtendedPrice NAME="ExtendedPrice" TYPE="CURRENCY">1360.0000</ExtendedPrice> 
    <contactName NAME="contactName" TYPE="VARCHAR">Jeff</contactName> 
    <shippingStreet NAME="shippingStreet" TYPE="VARCHAR">11 Acacia Avenue</shippingStreet> 
    <shippingCity NAME="shippingCity" TYPE="VARCHAR">Huddersfield</shippingCity> 
    <shippingCounty NAME="shippingCounty" TYPE="VARCHAR">Yorkshire</shippingCounty> 
    <shippingPostcode NAME="shippingPostcode" TYPE="VARCHAR">YO12 8LA</shippingPostcode> 
    <saleDate NAME="salesDate" TYPE="DATETIME">30. Mar. 16</saleDate> 
    </invoices_snet> 
    <invoices_snet> 
    <invoiceNum NAME="invoiceNum" TYPE="SMALLINT">368</invoiceNum> 
    <ProductID NAME="ProductID" TYPE="VARCHAR">SS368</ProductID> 
    <ProductName NAME="ProductName" TYPE="VARCHAR">Senna T-shirts</ProductName> 
    <ProductDescription NAME="ProductDescription" TYPE="VARCHAR">T-shirts of beige colour with cream piping</ProductDescription> 
    <Quantity NAME="Quantity" TYPE="SMALLINT">20</Quantity> 
    <UnitPrice NAME="UnitPrice" TYPE="CURRENCY">15.00</UnitPrice> 
    <ExtendedPrice NAME="ExtendedPrice" TYPE="CURRENCY">300.00</ExtendedPrice> 
    <contactName NAME="contactName" TYPE="VARCHAR">Jeff</contactName> 
    <shippingStreet NAME="shippingStreet" TYPE="VARCHAR">11 Acacia Avenue</shippingStreet> 
    <shippingCity NAME="shippingCity" TYPE="VARCHAR">Huddersfield</shippingCity> 
    <shippingCounty NAME="shippingCounty" TYPE="VARCHAR">Yorkshire</shippingCounty> 
    <shippingPostcode NAME="shippingPostcode" TYPE="VARCHAR">YO12 8LA</shippingPostcode> 
    <saleDate NAME="salesDate" TYPE="DATETIME">30. Mar. 16</saleDate> 
    </invoices_snet> 
    </invoices> 
</database> 




<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/database"> 
     <html> 
      <head> 
       <title>Invoice</title> 
       <link rel="stylesheet" href="invoicingCSS.css"/> 
      </head> 
      <body> 
       <h1>Invoice</h1> 
       <br></br> 
       <xsl:for-each select="invoices/invoices_snet"> 
       <h2>Order for Invoice Number: <xsl:value-of select="invoiceNum"/> </h2> 
       <table> 
        <tr> 
         <th>Product ID</th> 
         <th>Product Name</th> 
         <th>Product Description</th> 
         <th>Quantity</th> 
         <th>Unit Price</th> 
         <th>Extended Price</th> 
         <th>Contact Name</th> 
         <th>Shipping Address</th> 
         <th>Sales Date</th> 
        </tr> 
         <tr> 
          <td> 
           <xsl:value-of select="ProductID"/> 
          </td> 
          <td> 
           <xsl:value-of select="ProductName"/> 
          </td> 
          <td> 
           <xsl:value-of select="ProductDescription"/> 
          </td> 
          <td> 
           <xsl:value-of select="Quantity"/> 
          </td> 
          <td> 
           <xsl:value-of select="UnitPrice"/> 
          </td> 
          <td> 
           <xsl:value-of select="ExtendedPrice"/> 
          </td> 
          <td> 
           <xsl:value-of select="contactName"/> 
          </td> 
          <td> 
           <xsl:value-of select="concat(
                shippingStreet,' ', 
                shippingCity,', ', 
                shippingCounty,', ', 
                shippingPostcode)" 
           /> 
          </td>        
          <td> 
           <xsl:value-of select="saleDate"/> 
          </td> 
         </tr> 
       </table> 
       </xsl:for-each> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 
+0

** 1 ** invoiceNumによって並べ替えラインはありますか? ** 2。** Saxonを使用している場合、XSLT 1.0にはなぜ自分自身を制限しますか? - ** P.S。**これはグループ化の問題です。**ここには多くの**例があります。 –

+0

マイケル、あなたのご意見ありがとう! 1.はい、考え方は、invoiceNum要素の値が一意の識別子として機能するということです(ProductID、ProductName、ProductDescriptionなどと1対多の関係を持っています)。私は並べ替えを適用していない、XMLファイルは、データベースから抽出された状態にちょうどある。 2.私はXMLとXSLで始まったばかりなので、まだ2.0の機能をいくつか必要としていませんでした。しかしそれを変える害はない。グループ化? OK、あなたが言及したように、これらの問題に私の調査努力を集中させます... – user6196074

+0

Hm私はXSLT 2に変更しません。この大きなグループ化の問題がなければ0を返します。 1.0では、より多くの可能なxsltプロセッサーを手に入れることができます。 xsltprocまたはブラウザでさえも。私はXSLT 2.0をサポートしているブラウザを知らない。 –

答えて

0

グループは、内蔵のxsl:for-each-group命令で、XSLT 2.0で行うことが容易にくらいです。

はあなたの出発点としてこれを試してみてください:。

XSLT 2.0

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

<xsl:variable name="theader"> 
    <tr> 
     <th>ProductID</th> 
     <th>Quantity</th> 
     <!-- add more as required --> 
    </tr> 
</xsl:variable> 

<xsl:template match="/database"> 
    <html> 
     <xsl:for-each-group select="invoices/invoices_snet" group-by="invoiceNum"> 
      <table border="1"> 
       <xsl:copy-of select="$theader"/> 
       <xsl:apply-templates select="current-group()"/> 
      </table> 
     </xsl:for-each-group> 
    </html> 
</xsl:template> 

<xsl:template match="invoices_snet"> 
    <tr> 
     <td> 
      <xsl:value-of select="ProductID"/> 
     </td> 
     <td> 
      <xsl:value-of select="Quantity"/> 
     </td> 
     <!-- add more as required --> 
    </tr> 
</xsl:template> 

</xsl:stylesheet> 

<xsl:template match="invoices_snet"> 
    <tr> 
     <td> 
      <xsl:value-of select="ProductID"/> 
     </td> 
     <td> 
      <xsl:value-of select="Quantity"/> 
     </td> 
    </tr> 
</xsl:template> 

</xsl:stylesheet> 
0

まず、これは、例えばmuenchianグループになります自己賛成行うとXSLT 1.0のためにグループ化するXSLTのための顔をしていますthis

そしてここにあなたのXMLへの適応のための基本的な構造:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml"/> 

    <xsl:key name="kinvoices_snet" match="invoices_snet" use="invoiceNum"/> 
    <xsl:template match="invoices"> 
    <xsl:for-each select="invoices_snet [ 
          count (key('kinvoices_snet',./invoiceNum)[1] | .) = 1 ]"> 

     <xsl:variable name="this" select="." /> 
     <g> 
     <gh> 
      <xsl:value-of select="invoiceNum" /> 
     </gh> 
     <!-- group stuff --> 

     <xsl:for-each select=" key('kinvoices_snet',$this/invoiceNum)"> 
      <!-- group member stuff --> 
      <gm> 
       <xsl:value-of select="ProductID" /> 
      </gm> 
     </xsl:for-each> 
     </g> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 
関連する問題