0

次のようなテーブル構造があります。

ID 名前 親ID
1 root_category ヌル
2 あっぱれ 1
3 付属品 1
4 シャツ 2
5 パンツ 2
6 ハンドバッグ 3
7 ジュエリー 3

このテーブルから、このtest.xmlのようなXMLファイルを作成しました

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<childrens>
  <child id="1" value="Root Catalog" parent_id="0">
    <child id="2" value="Apparel" parent_id="1">
      <child id="4" value="Shirts" parent_id="2"/>
      <child id="5" value="Pants" parent_id="2"/>
    </child>
    <child id="3" value="Accessories" parent_id="1">
      <child id="6" value="Handbags" parent_id="3"/>
      <child id="7" value="Jewelry" parent_id="3"/>
    </child>
  </child>
</childrens>

このxmlファイルを使用して、このtest.xslのようなXSLファイルを作成しました

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>Testing</h2>
  <table border="1">
   <tr bgcolor="#9acd32">
    <th>Id </th>
    <th>Name</th>
  </tr>
  <xsl:for-each select="childrens/child">
  <tr>
    <td><xsl:value-of select="@id"/></td>
    <td><xsl:value-of select="@value"/></td>
  </tr>
  </xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

しかし、それは機能しておらず、データが表示されていません

データは次のようになります

Root Category
 - Apparel 
   -- Shirts
   -- Pants 
 - Accessories
   -- Handbags 
  -- Jewelry
4

2 に答える 2

1

あなたが期待している出力は完全にはわかりません。現在の XSLT はテーブルを出力していますが、あなたの例はネストされたリストのように見えます。要素の階層構造を表示したい場合は、おそらくネストされたリストが適しています。

これは、単一のテンプレートを使用して要素に一致させ、それ自体を再帰的に呼び出すことで比較的簡単に実現できます。

   <xsl:template match="child">
      <li>
         <xsl:value-of select="@value"/>
         <xsl:if test="child">
            <ul>
               <xsl:apply-templates select="child"/>
            </ul>
         </xsl:if>
      </li>
   </xsl:template>

つまり、li要素を出力し、要素自体に子がある場合は、この要素内で新しいul要素を開始します。

ここに完全な XSLT があります

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

   <xsl:template match="/childrens">
      <html>
         <body>
            <ul>
               <xsl:apply-templates select="child"/>
            </ul>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="child">
      <li>
         <xsl:value-of select="@value"/>
         <xsl:if test="child">
            <ul>
               <xsl:apply-templates select="child"/>
            </ul>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>

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

<html>
   <body>
      <ul>
         <li>Root Catalog
            <ul>
               <li>Apparel
                  <ul>
                     <li>Shirts</li>
                     <li>Pants</li>
                  </ul>
               </li>
               <li>Accessories
                  <ul>
                     <li>Handbags</li>
                     <li>Jewelry</li>
                  </ul>
               </li>
            </ul>
         </li>
      </ul>
   </body>
</html>

次のように視覚的に表示されます

  • ルート カタログ
    • 衣服
      • シャツ
      • パンツ
    • 付属品
      • ハンドバッグ
      • ジュエリー

編集: コメントで JLRishie が述べたように (ありがとう!)、 li要素にID 属性を含めたい場合は、次のようにします。

<li id="{@id}">
于 2013-01-22T08:50:56.063 に答える
1

テキスト出力を行う XSLT を実行しようとしました。要求された構造を取得するために、改行とタブを追加しました。ただし、XML を変更し、要素に子とは異なる名前を付けることを強くお勧めします。私の意見では、操作が簡単になるでしょう。しかし、それは単なる推奨事項です。

この XSLT を適用します。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:output method="text"/>

<xsl:variable name="lf" select="'&#x0A;'"/>
<xsl:variable name="tab" select="'&#x09;'"/>

<xsl:template match="/">
    <xsl:text>Root Category</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

<!-- match the apparel -->
<xsl:template match="child[@value='Apparel']">
    <xsl:value-of select="concat('-- ',@value)"/>
    <xsl:value-of select="$lf"/>
    <xsl:apply-templates select="child" mode="apparel"/>
</xsl:template>
<!-- match the child elements of apparel -->
<xsl:template match="child" mode="apparel">
    <xsl:value-of select="$tab"/>
    <xsl:value-of select="$tab"/>
    <xsl:value-of select="$tab"/>
    <xsl:value-of select="concat('- ',./@value)"/>
    <xsl:value-of select="$lf"/>
</xsl:template>

<!-- match the accessories -->
<xsl:template match="child[@value='Accessories']">
    <xsl:value-of select="concat('-- ',@value)"/>
    <xsl:value-of select="$lf"/>
    <xsl:apply-templates select="child" mode="accessories"/>
</xsl:template>
<!-- match the child elements of accessories -->
<xsl:template match="child" mode="accessories">
    <xsl:value-of select="$tab"/>
    <xsl:value-of select="$tab"/>
    <xsl:value-of select="$tab"/>
    <xsl:value-of select="concat('- ',./@value)"/>
    <xsl:value-of select="$lf"/>
</xsl:template>



</xsl:stylesheet>

この XML 入力に:

<?xml version="1.0" encoding="ISO-8859-1"?>
<childrens>
<child id="1" value="Root Catalog" parent_id="0">
    <child id="2" value="Apparel" parent_id="1">
        <child id="4" value="Shirts" parent_id="2"/>
        <child id="5" value="Pants" parent_id="2"/>
    </child>
    <child id="3" value="Accessories" parent_id="1">
        <child id="6" value="Handbags" parent_id="3"/>
        <child id="7" value="Jewelry" parent_id="3"/>
    </child>
</child>
</childrens>

次の出力が得られます。

Root Category

    -- Apparel
        - Shirts
        - Pants

    -- Accessories
        - Handbags
        - Jewelry
于 2013-01-22T09:08:28.767 に答える