2016-10-17 23 views
-1

値のグループをループして2列のテーブルに出力する必要があります。私は、次の解決策について考えXSLTを使用した動的HTMLテーブル

<table class="main"> 

    <xsl:for-each select="Attribute/Gruppe"> 
     <xsl:if test="current()/@ID=20064490"> 
      <xsl:variable name="open_row"><![CDATA[<tr><td style="width:50%;"> 
       <xsl:value-of select="current()/@name" /></td>]]></xsl:variable> 
      <xsl:variable name="closing_row"><![CDATA[<td style="width:50%;"> 
       <xsl:value-of select="current()/@name" /></td></tr>]]></xsl:variable> 

      <xsl:variable name="table"> 
       <xsl:for-each select="*"> 
        <xsl:choose> 
         <xsl:when test="(position() mod 2) = 1"> 
          <xsl:value-of select="$open_row" 
           disable-output-escaping="yes" /> 

         </xsl:when> 
         <xsl:otherwise> 

          <xsl:value-of select="$closing_row" 
           disable-output-escaping="yes" /> 

         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:for-each> 
      </xsl:variable> 
      <xsl:value-of select="$table" 
       disable-output-escaping="yes" /> 
     </xsl:if> 
    </xsl:for-each> 
</table> 

(xslt1でなければなりません)私は今、私はクローズ<tr>または開口部</tr>が必要になるかどうかを調べるためにposition()を使用していたコードを変更しました。

XSLTに単一のタグを書き込めないという問題が全体的に要約されることがあります。そして、disable-output-escapingは機能しません。

結果のHTMLは、グループ内のすべてのノードのhttps://jsfiddle.net/dwetctm6/

でなければなりません。テーブル内のノードの順序は関係ありません。 (横断最初またはダウン最初の)順序は問題ではない場合は特に - 非常に簡単である2列のテーブルにノードを分割

<bgroup> 
    <NODE1>text</NODE1> 
    <NODE2>text</NODE2> 
    <NODE n-1>text</NODE n-1> 
    <NODE n>text</NODE n> 
</bgroup> 
+0

入力、実行可能なスタイルシート、および予想される結果を含む**再現可能な**例を投稿してください - [mcve] –

+0

私はすべてのデータを欲しいと思っています。私は2列のテーブルが必要です。あなたがコードを見ていればそれは明確ではありませんか?不明な点は? – Jan

+1

私はあなたのデータを**すべて**にしたくありません。私はテスト環境にコピー/貼り付けするだけで、問題を再現するのに十分なコードが必要です。正しい結果が何であるかを知る必要があるので、私はそれを得る方法を提案することができます。 –

答えて

0

さらに次のXMLを仮定する。

XML

<bgroup> 
    <NODE1>A</NODE1> 
    <NODE2>B</NODE2> 
    <NODE3>C</NODE3> 
    <NODE4>D</NODE4> 
    <NODE5>E</NODE5> 
</bgroup> 
整形 inpoutに適用

XSLT 1.0

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

<xsl:template match="/bgroup"> 
    <table border="1"> 
     <xsl:for-each select="*[position() mod 2 = 1]"> 
      <tr> 
       <td><xsl:value-of select="."/></td> 
       <td><xsl:value-of select="following-sibling::*[1]"/></td> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

には、以下のスタイルシートを考えてみましょう

結果は次のようになります。

としてレンダリング
<table border="1"> 
    <tr> 
     <td>A</td> 
     <td>B</td> 
    </tr> 
    <tr> 
     <td>C</td> 
     <td>D</td> 
    </tr> 
    <tr> 
     <td>E</td> 
     <td/> 
    </tr> 
</table> 

enter image description here

+0

ありがとう..ありがとう..もしあなたがこの 'following-sibling :: * [1]'を知っていれば、それは自明である。テンプレートの代わりにfor-eachを使ってあなたのソリューションを選んだ。 – Jan

0

まあ、いくつかの発言は、まず第一に行う必要があります。

  1. あなたはどのように学ばなければなりませんXSLTは動作します:これは、XMLに基づいて、オーダーwで構成されなければならないテンプレート用言語ですay:開いているノードはすべて同じスコープ内で閉じる必要があります。 michael.hor257kは正しい:あなたはスコープ内のノードを開いて別の別のノードに閉じてはならない。

  2. また、入力XMLが適切に構造化されていないように見える必要があります。同じ名前とタイプのノードを繰り返して使用する必要があります。 NODE-nノードがすべて機能的にも意味的にも等しい場合は、同じ名前で問題はありません。同じ名前のノードを複数持つことができます。

そして今は、解決策:あなたはそれを掲載しているとして、あなたのXMLをAsumingであり、異なる名前を持つという名前のノードに基づいてテンプレートの定義は存在しないことができるので、私は、一致したすべての子ノードbgroupルートノードの。

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

    <xsl:template match="/bgroup"> 
     <html> 
      <body> 
       <table> 
        <xsl:apply-templates select="*[position() mod 2 =1]"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="*"> 
     <tr> 
      <td><xsl:value-of select="."/></td> 
      <td><xsl:value-of select="following-sibling::*[1]"/></td> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 

それはあなたが、どのようにXSL言語の秩序構造に感謝を実現することが重要ですが、あなたが出力のちょうど垣間見るとなりますどのように見ることができますので、XSLは、このように簡単することができXSLテンプレート

関連する問題