0

我有一个这样的表结构:

ID 姓名 parent_id
1 根类别 空值
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 回答