2017-08-31 14 views
1

1つの受注を持つXMLがあり、受注は3つの受注です。私は後の午前出力は、繰り返しノードでのxslトランスフォームに失敗しました

|Line No | Description | Qty 
----------------------------- 
|  1 | Product A | 5 
|  2 | Product B | 10 
|  3 | Product C ! 7 
----------------------------- 

などの表では、しかし、私が達成何

|Line No | Description | Qty 
----------------------------- 
|  1 | Product A | 5 
|  1 | Product A | 5 
|  1 | Product A | 5 
----------------------------- 

(私はあまりテキストを供給している場合は申し訳ありませんが)、私は私のXML入力とフルの私のXSLなどが

です

誰かが私の間違いを見つけたり、今後のアドバイスをすることができますか?

XML入力

<?xml version="1.0" encoding="UTF-8"?> 
<SOQrySurcharge> 
    <SalesOrders Language="05" Language2="EN" CssStyle="" DecFormat="1" DateFormat="01" Role="01" Version="6.1.083" OperatorPrimaryRole=" "> 
    <Order> 
     <CustomerPoNumber>7000654438</CustomerPoNumber> 
     <SalesOrder>003411</SalesOrder> 

    </Order> 
    </SalesOrders> 
    <SorDetail Language="05" Language2="EN" CssStyle="" DecFormat="1" DateFormat="01" Role="01" Version="6.1.025" OperatorPrimaryRole=" " xmlns:SALARE="SALARE" xmlns:SALSLS="SALSLS" xmlns:TBLART="TBLART" xmlns:SALBRN="SALBRN" xmlns:TBLCUR="TBLCUR"> 
    <SalesOrder>003411</SalesOrder> 
    <CustomerName>Siemens</CustomerName> 

    <HeaderText> 
    </HeaderText> 
    <SalesOrderLine> 
     <Merchandise> 
     <SalesOrderLine> 1</SalesOrderLine> 
     <MStockCode>11</MStockCode> 
     <MStockDes>Low Temp SG Surcharge</MStockDes> 
     <MShipQty>  4.100</MShipQty> 
     <MPrice>  121.72000</MPrice> 
     <OrderLineValue>   499.05</OrderLineValue> 

     </Merchandise> 
    </SalesOrderLine> 
    <SalesOrderLine> 
     <Merchandise> 
     <SalesOrderLine> 2</SalesOrderLine> 
     <MStockCode>1</MStockCode> 
     <MStockDes>Grey Iron Surcharge</MStockDes> 
     <MShipQty>  0.264</MShipQty> 
     <MPrice>  137.63000</MPrice> 
     <OrderLineValue>   36.33</OrderLineValue> 

     </Merchandise> 
    </SalesOrderLine> 
    <SalesOrderLine> 
     <Merchandise> 
     <SalesOrderLine> 3</SalesOrderLine> 
     <MStockCode>13</MStockCode> 
     <MStockDes>Ferritic SG + Mo Surcharge</MStockDes> 
     <MShipQty>  15.155</MShipQty> 
     <MPrice>  155.07000</MPrice> 

     </Merchandise> 
    </SalesOrderLine> 
    </SorDetail> 
</SOQrySurcharge> 

XSLスクリプト

<?xml version="1.0" encoding="Windows-1252" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" /> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Mestect Usage E-mail</title> 
       <style> 
      body { 
      } 

      h1 { 
       text-align: left; 
       color: #221076; 
       font-size: 40px; 
       font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; 
       font-weight: bold; 
      } 

      .def-container { 
       border: 2px solid black; 
       margin: 0 0 3px 0; 
       width: 70%; 
       background-color: #FFA500; 
      } 

      .heading { 
       display: inline; 
       color: black; 
       font-size: medium; 
       font-family: Verdana, sans-serif; 
       font-weight: bold; 
      } 

      .headingvalue { 
       display: inline; 
       color: black; 
       font-size: medium; 
       font-family: Verdana, sans-serif; 
      } 

       </style> 
      </head> 
      <body> 
      <p> The following orders have been created by dataswitch in Syspro Company R</p> 
       <h1>Auto created Material Surcharges</h1> 
       <div class="def-container"> 
        <div class="heading">Customer Purchase Order: </div> 
        <div class="headingvalue"> 
         <xsl:value-of select="//CustomerPoNumber" /> 
        </div> 
        <div class="heading">Customer: </div> 
        <div class="headingvalue"> 
         <xsl:value-of select="//CustomerName" /> 
        </div> 
        <div class="heading">Syspro Order: </div> 
        <div class="headingvalue"> 
         <xsl:value-of select="//SalesOrder" /> 
        </div> 
        <table border="1"> 
        <tr> 

         <th>Surcharge Type</th> 
         <th>Surcharge Amount</th> 
         <th>Tonnes</th> 
         <th>Line Value</th> 

        </tr> 

        <xsl:for-each select="//Merchandise"> 

         <tr> 
          <td> 
           <xsl:value-of select="//MStockDes" /> 
          </td> 
          <td> 
           <xsl:value-of select="//MPrice" /> 
          </td> 
          <td> 
           <xsl:value-of select="//MShipQty" /> 
          </td> 
          <td> 
           <xsl:value-of select="//OrderLineValue" /> 
          </td> 
         </tr> 
         </xsl:for-each> 



        </table> 
       </div> 

      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

は最後に、あなたはこのような//Merchandiseなどの表現を自由に使用することを行った結果

<html> 
    <head> 
    <title>Mestect Usage E-mail</title> 
    <style> 
      body { 
      } 

      h1 { 
       text-align: left; 
       color: #221076; 
       font-size: 40px; 
       font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; 
       font-weight: bold; 
      } 

      .def-container { 
       border: 2px solid black; 
       margin: 0 0 3px 0; 
       width: 70%; 
       background-color: #FFA500; 
      } 

      .heading { 
       display: inline; 
       color: black; 
       font-size: medium; 
       font-family: Verdana, sans-serif; 
       font-weight: bold; 
      } 

      .headingvalue { 
       display: inline; 
       color: black; 
       font-size: medium; 
       font-family: Verdana, sans-serif; 
      } 

       </style> 
    </head> 
    <body> 
    <p> The following orders have been created by dataswitch in Syspro Company R</p> 
    <h1>Auto created Material Surcharges</h1> 
    <div class="def-container"> 
     <div class="heading">Customer Purchase Order: </div> 
     <div class="headingvalue">7000654438</div> 
     <div class="heading">Customer: </div> 
     <div class="headingvalue">Siemens</div> 
     <div class="heading">Syspro Order: </div> 
     <div class="headingvalue">003411</div> 
     <table border="1"> 
     <tr> 
      <th>Surcharge Type</th> 
      <th>Surcharge Amount</th> 
      <th>Tonnes</th> 
      <th>Line Value</th> 
     </tr> 
     <tr> 
      <td>Low Temp SG Surcharge</td> 
      <td>  121.72000</td> 
      <td>  4.100</td> 
      <td>   499.05</td> 
     </tr> 
     <tr> 
      <td>Low Temp SG Surcharge</td> 
      <td>  121.72000</td> 
      <td>  4.100</td> 
      <td>   499.05</td> 
     </tr> 
     <tr> 
      <td>Low Temp SG Surcharge</td> 
      <td>  121.72000</td> 
      <td>  4.100</td> 
      <td>   499.05</td> 
     </tr> 
     </table> 
    </div> 
    </body> 
</html> 
+1

問題を実証するために必要な最低限の例を減らしてください - 参照:[mcve] –

+0

ありがとうございました。初心者として、私はいつも重要なビットを残して怖がっていた..悲しい –

答えて

2

商品ノードと一致する追加のテンプレートと<xsl:for-each>の交換を検討してください。そして、ノードテキストに余分なスペースを削除するnormalize-space()を使用することはXSLT

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

    <xsl:template match="/SOQrySurcharge"> 
    <html> 
     <head> 
     <title>Mestect Usage E-mail</title> 
     <style>body { } h1 { text-align: left; color: #221076; font-size: 40px; font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-weight: bold; } .def-container { border: 2px solid black; margin: 0 0 3px 0; width: 70%; background-color: #FFA500; } .heading { display: inline; color: black; font-size: medium; font-family: Verdana, sans-serif; font-weight: bold; } .headingvalue { display: inline; color: black; font-size: medium; font-family: Verdana, sans-serif; }</style> 
     </head> 
     <body> 
     <p>The following orders have been created by dataswitch in Syspro Company R</p> 
     <h1>Auto created Material Surcharges</h1> 
     <div class="def-container"> 
      <div class="heading">Customer Purchase Order:</div> 
      <div class="headingvalue"> 
      <xsl:value-of select="SalesOrders/Order/CustomerPoNumber" /> 
      </div> 
      <div class="heading">Customer:</div> 
      <div class="headingvalue"> 
      <xsl:value-of select="SorDetail/CustomerName" /> 
      </div> 
      <div class="heading">Syspro Order:</div> 
      <div class="headingvalue"> 
      <xsl:value-of select="SalesOrders/Order/SalesOrder" /> 
      </div> 
      <table border="1"> 
      <tr> 
       <th>Surcharge Type</th> 
       <th>Surcharge Amount</th> 
       <th>Tonnes</th> 
       <th>Line Value</th> 
      </tr> 
      <xsl:apply-templates select="SorDetail/SalesOrderLine" /> 
      </table> 
     </div> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="Merchandise"> 
    <tr> 
     <td> 
     <xsl:value-of select="normalize-space(MStockDes)" /> 
     </td> 
     <td> 
     <xsl:value-of select="format-number(normalize-space(MPrice),'#0.##')" /> 
     </td> 
     <td> 
     <xsl:value-of select="format-number(normalize-space(MShipQty),'#0.##')" /> 
     </td> 
     <td> 
     <xsl:if test="OrderLineValue"> 
      <xsl:value-of select="format-number(normalize-space(OrderLineValue),'#.##')" /> 
     </xsl:if> 
     </td> 
    </tr> 
    </xsl:template> 

</xsl:stylesheet> 

出力XML

が更新された値

<html> 
    <head> 
    <title>Mestect Usage E-mail</title> 
    <style>body { } h1 { text-align: left; color: #221076; font-size: 40px; font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-weight: bold; } .def-container { border: 2px solid black; margin: 0 0 3px 0; width: 70%; background-color: #FFA500; } .heading { display: inline; color: black; font-size: medium; font-family: Verdana, sans-serif; font-weight: bold; } .headingvalue { display: inline; color: black; font-size: medium; font-family: Verdana, sans-serif; }</style> 
    </head> 
    <body> 
    <p>The following orders have been created by dataswitch in Syspro Company R</p> 
    <h1>Auto created Material Surcharges</h1> 
    <div class="def-container"> 
     <div class="heading">Customer Purchase Order:</div> 
     <div class="headingvalue">7000654438</div> 
     <div class="heading">Customer:</div> 
     <div class="headingvalue">Siemens</div> 
     <div class="heading">Syspro Order:</div> 
     <div class="headingvalue">003411</div> 
     <table border="1"> 
     <tr> 
      <th>Surcharge Type</th> 
      <th>Surcharge Amount</th> 
      <th>Tonnes</th> 
      <th>Line Value</th> 
     </tr> 
     <tr> 
      <td>Low Temp SG Surcharge</td> 
      <td>121.72</td> 
      <td>4.1</td> 
      <td>499.05</td> 
     </tr> 
     <tr> 
      <td>Grey Iron Surcharge</td> 
      <td>137.63</td> 
      <td>0.26</td> 
      <td>36.33</td> 
     </tr> 
     <tr> 
      <td>Ferritic SG + Mo Surcharge</td> 
      <td>155.07</td> 
      <td>15.16</td> 
      <td /> 
     </tr> 
     </table> 
    </div> 
    </body> 
</html> 
+0

ありがとう、私の問題を説明するだけでなく、私は尋ねることがなかった答えは、スペースについてでした。余計なトラブルを抱えていただきありがとうございます。あなたはすぐに2つの小数点以下を四捨五入してxslを証明することができます。 –

+1

素晴らしい!喜んで助けてください。 XSLT 1.0の丸めについては、ここでの更新で示した 'format-number()'関数を見てください。欠損値のNaN結果を避けるには、 ''の使用に注意してください。 – Parfait

2

を変換します。先頭の//は、入力ドキュメントのルートから絶対選択を行いますが、現在の要素からの相対選択が必要です。すべての細部を見ることなく、最初に行うべきことは、これらのすべての式で偽の先頭「//」を切り取ることです。

+0

問題は本当に子ノードです...しかし、ええ、場所の二重スラッシュは問題です。 –

+0

申し訳ありませんが、例からコピーされました/ /私はそれを取る1つのノードから "ルートノードから"と/平均を意味するか? –

+0

仕様書またはチュートリアルをお読みください。例からセマンティクスを推測して言語を習得しようとしないでください。それは不合理に非効率的なプロセスです。 –

0

xpathクエリの//はノードの送信を返します。 <xsl:value-ofは最初の要素だけを見ています。何が起こっているのは、各Merchandiseの名前で最初の要素を返すことです。あなたはxpathクエリを以下のような相対的なものに変更する必要があります。

<xsl:for-each select="//Merchandise"> 
    <tr> 
     <td> 
      <xsl:value-of select="./MStockDes" /> 
     </td> 
     <td> 
      <xsl:value-of select="./MPrice" /> 
     </td> 
関連する問題