2017-01-13 12 views
0
私は次のような問題き

とXMLのために働いてXSLTを取得する方法:XSDの がそれを与えられたと言う:私のために存在することができるフィールド41を意味は繰り返しエントリ

<xs:element name="somevalue" type="ait2:eic" maxOccurs="unbounded"> 
    <xs:annotation> 
     <xs:documentation>Field No. 41</xs:documentation> 
    </xs:annotation> 
</xs:element> 

を複数回(フィールド39または42回は1回のみ許可されます)。ない独自の順序でのために、それぞれが不可能なそのので

<somevalue>12323K</somevalue> 
<somevalue>12324I</somevalue> 

(または私は間違っている?):私はそれが実際に(XMLから)ない例があります。 私のコードは次のようになり、これまでにちょうど最初の出現をカバー(XSLT):

<tr> 
    <td>41</td> 
    <td>Some value</td> 
    <td> 
     <xsl:value-of select="//somevalue"/> 
    </td> 
</tr> 

どのようにそれは繰返しグループを持つことが可能でしょうか?したがって、それぞれの「somevalue」エントリーが表示されます。

THX!

EDIT:コード例

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="#nsc"?> 
<xsl:stylesheet id="nsc" version="1.0" xmlns:data="http://www.acer.europa.eu/REMIT/TestTable_V1.xsd" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<data:data> 
    <TestTable> 
     <TradeList> 
      <nonStandardContractReport> 
       <settlementMethod>P</settlementMethod> 
       <deliveryPointOrZone>12323K</deliveryPointOrZone> 
       <deliveryPointOrZone>12324I</deliveryPointOrZone> 
       <deliveryStartDate>2022-01-01</deliveryStartDate> 
       <deliveryEndDate>2023-01-01</deliveryEndDate> 
       <loadType>GD</loadType> 
       <actionType>N</actionType> 
      </nonStandardContractReport> 
     </TradeList> 
    </TestTable> 
</data:data> 
<xsl:template match="/xsl:stylesheet"> 
    <xsl:apply-templates select="data:data/*" /> 
</xsl:template> 
<xsl:template match="TestTable"> 
    <html> 
     <table border="0" style="border-collapse:collapse;"> 
      <body> 
       <tr> 
        <td>40</td> 
        <td>Option strike price</td> 
        <td> 
         <xsl:value-of select="//optionDetails/optionStrikePrice"/> 
        </td> 
       </tr> 
       <tr> 
        <th/> 
        <th>Delivery profile</th> 
        <th/> 
       </tr> 
       <tr> 
        <td>41</td> 
        <td>Delivery point or zone</td> 
        <td> 
         <xsl:value-of select="//deliveryPointOrZone"/> 
        </td> 
       </tr> 
       <tr> 
        <td>42</td> 
        <td>Delivery start date</td> 
        <td> 
         <xsl:value-of select="//deliveryStartDate"/> 
        </td> 
       </tr> 
       <tr> 
        <td>43</td> 
        <td>Delivery end date</td> 
        <td> 
         <xsl:value-of select="//deliveryEndDate"/> 
        </td> 
       </tr> 
       <tr> 
        <td>44</td> 
        <td>Load type</td> 
        <td> 
         <xsl:value-of select="//loadType"/> 
        </td> 
       </tr> 
       <tr> 
        <th/> 
        <th>Life cycle information</th> 
        <th/> 
       </tr> 
       <tr> 
        <td>45</td> 
        <td>Action type</td> 
        <td> 
         <xsl:value-of select="//actionType"/> 
        </td> 
       </tr> 
      </body> 
     </table> 
    </html> 
</xsl:template> 

+0

あなたの例では、予想される結果とは何ですか? - P.S.はい、あなたは* 'xsl:for-each'について間違っています。しかし、文脈なしで助言するのは難しいです:[mcve] –

+0

その埋め込まれたxmlファイルなので、別にするのは難しいです。私はすべてのコードを投稿せずに仕事を得ることができます。 予想される結果は、エントリ41がテーブル内で2回繰り返されることです。 –

+0

その意味がわかりません。 XSLTを使用してファイルを処理できる場合は、* identity transform *テンプレートを使用してそのまま引き出すこともできます。そして、実際のファイルは必要としません(最小化された例のみ)。そして、あなたは私の質問に答えたわけではありません:複数の値を取得したい場合は、出力にどのように表示するかを教えてください。 –

答えて

0

次の例を考えてみましょう:

XML

<root> 
    <alpha>10</alpha> 
    <bravo>20</bravo> 
    <bravo>21</bravo> 
    <bravo>22</bravo> 
    <charlie>30</charlie> 
</root> 

XSLT 1.0同じ結果がよりエレガントなアプローチを用いて達成されていることができること

enter image description here


注:

としてレンダリング
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" encoding="utf-8" /> 

<xsl:template match="/root"> 
    <table border="1"> 
     <tr> 
      <td>A</td> 
      <td>Prima</td> 
      <td> 
       <xsl:value-of select="alpha"/> 
      </td> 
     </tr> 
     <xsl:for-each select="bravo"> 
      <tr> 
       <td>B</td> 
       <td>Secunda</td> 
       <td> 
        <xsl:value-of select="."/> 
       </td> 
      </tr> 
     </xsl:for-each> 
     <tr> 
      <td>C</td> 
      <td>Tertia</td> 
      <td> 
       <xsl:value-of select="charlie"/> 
      </td> 
     </tr> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

結果

<table border="1"> 
    <tr> 
     <td>A</td> 
     <td>Prima</td> 
     <td>10</td> 
    </tr> 
    <tr> 
     <td>B</td> 
     <td>Secunda</td> 
     <td>20</td> 
    </tr> 
    <tr> 
     <td>B</td> 
     <td>Secunda</td> 
     <td>21</td> 
    </tr> 
    <tr> 
     <td>B</td> 
     <td>Secunda</td> 
     <td>22</td> 
    </tr> 
    <tr> 
     <td>C</td> 
     <td>Tertia</td> 
     <td>30</td> 
    </tr> 
</table> 

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" encoding="utf-8" /> 

<xsl:template match="/root"> 
    <table border="1"> 
     <xsl:apply-templates/> 
    </table> 
</xsl:template> 

<xsl:template match="alpha"> 
    <tr> 
     <td>A</td> 
     <td>Prima</td> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
    </tr> 
</xsl:template> 

<xsl:template match="bravo"> 
    <tr> 
     <td>B</td> 
     <td>Secunda</td> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
    </tr> 
</xsl:template> 

<xsl:template match="charlie"> 
    <tr> 
     <td>C</td> 
     <td>Tertia</td> 
     <td> 
      <xsl:value-of select="."/> 
     </td> 
    </tr> 
</xsl:template> 

</xsl:stylesheet> 
+0

完全に動作します。 "。"行う? –

+0

"*' .'の位置指定は 'self :: node()'の短縮形です。* "https://www.w3.org/TR/xpath/#path-abbrev –