0

xmlからhtmlを生成する必要があり、複数のタグを相互にネストできるという問題があります。どうすればそれらすべてを再帰的に渡すことができますか?

これがxmlからのサンプルです:

<rows>
   <row>
       <cell>1</cell>
       <cell>2</cell>
       <cell>1</cell>
       <cell>2</cell>
       <row>
         <cell>3</cell>
         <cell>4</cell>
            <row>
              <cell>5</cell>
              <cell>6</cell>
              <cell>6</cell>
           </row>
       </row>
   </row>
 </rows>

私のxsltは次のとおりです。

    <table>
      <th>1</th><th>2</th>3<th>4</th><th>5</th>
      <xsl:for-each select="rows/row">
        <tr>
          <xsl:for-each select="cell">
            <td>
              <xsl:value-of select="."/>
            </td>
          </xsl:for-each>
         </tr>
         <xsl:for-each select="row">
           <tr>
             <xsl:for-each select="cell">
               <td>
                 <xsl:value-of select="."/>
               </td>
             </xsl:for-each>
           </tr>
         </xsl:for-each>    
       </xsl:for-each>   
     </table>

だから私の質問は、各行にすべての属性を表示するにはどうすればよいですか?

編集:xsltから生成されたhtml

<html><body>
<table>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>

<tr>
<td>1</td>
<td>2</td>
<td>1</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>4</td>
</tr>
</table>
</body></html>

2番目の編集:

xslt:

    <xsl:template match="cell">


     <td style="overflow:hidden;border:1px solid black;">
         <div style="width:100px;height:20px;margin-bottom: 10px;margin-top: 10px;">

           <xsl:variable name="id1" select="row/@id"/>

           <xsl:if test="starts-with(id1, 'Dir')">
               <xsl:value-of select="cell/@image"/>
             </xsl:if>

            <xsl:value-of select="."/>


         </div>
      </td>

   </xsl:template>

xml:

<row id="Dir_44630">
  <cell>Text</cell>
  <cell>1</cell>
  <cell>1.00</cell>
  <cell>3</cell>
  <cell 4</cell>
  <cell>5</cell>
  <cell>6</cell>
  <cell>7</cell>
</row>
4

1 に答える 1

1

まず、あなたの場合、ルート要素に一致するテンプレートを用意することから始めます

<xsl:template match="/rows">

この場合、テーブルヘッダーを作成するようにコーディングしてから、子要素の検索を開始する必要があります。

<xsl:template match="/rows">
   <table>
      <!-- Header -->
      <xsl:apply-templates select="row"/>
   </table>
</xsl:template>

次に、行要素に一致するテンプレートが作成されるので、 tr要素を出力して、個々のセルを探すことができます。

<xsl:template match="row">
   <tr>
      <xsl:apply-templates select="cell"/>
   </tr>
   <xsl:apply-templates select="row"/>
</xsl:template>

現在の行要素にネストされている要素の検索を続行するための再帰呼び出しに注意してください。

同様に、td要素とセル値を出力するだけのセル要素に一致するテンプレートがあります。

私がよくわからない唯一のことは、正確にどの行を出力するかについてのあなたのルールです。2レベル以上の深さでネストされた要素を出力したくないようです。この場合、少なくとも2つ以上の行が祖先である行を無視するテンプレートを追加できます。

<xsl:template match="row[ancestor::row[2]]"/>

これが完全なXSLTです

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

   <xsl:template match="/rows">
      <table>
         <tr>
            <th>1</th>
            <th>2</th>
            <th>3</th>
            <th>4</th>
            <th>5</th>
         </tr>
         <xsl:apply-templates select="row"/>
      </table>
   </xsl:template>

   <xsl:template match="row">
      <tr>
         <xsl:apply-templates select="cell"/>
      </tr>
      <xsl:apply-templates select="row"/>
   </xsl:template>

   <xsl:template match="row[ancestor::row[2]]"/>

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

サンプルXMLに適用すると、次のように出力されます。

<table>
   <tr>
      <th>1</th>
      <th>2</th>
      <th>3</th>
      <th>4</th>
      <th>5</th>
   </tr>
   <tr>
      <td>1</td>
      <td>2</td>
      <td>1</td>
      <td>2</td>
   </tr>
   <tr>
      <td>3</td>
      <td>4</td>
   </tr>
</table>

編集:セル要素に一致するテンプレート内から要素の属性にアクセスする場合は、それが親要素であることを指定する必要があります。

<xsl:variable name="id1" select="../@id"/> 

これを行うselect="row/@id"と、実際には現在のセル要素の子である行が検索されます。

于 2012-10-19T07:54:43.143 に答える