与HTML有关系的XML:使用XSLT的UL

时间:2013-10-20 22:33:42

标签: xml xslt xpath xhtml

我有以下示例XML:

<root>
<Entities>
<Entity>
<property type=”Name”>Name1</property>
<property type=”Parent_id”>-1</property>
<property type=”id”>1</property>
</Entity>
<Entity>
<property type=”Name”>Name2</property>
<property type=”Parent_id”>1</property>
<property type=”id”>2</property>
</Entity>

<Entity>
<property type=”Name”>Name3</property>
<property type=”Parent_id”>2</property>
<property type=”id”>3</property>
</Entity>

<Entity>
<property type=”Name”>Name4</property>
<property type=”Parent_id”>2</property>
<property type=”id”>4</property>
</Entity>

<Entity>
<property type=”Name”>Name5</property>
<property type=”Parent_id”>3</property>
<property type=”id”>5</property>
</Entity>
</Entities>
</root>

XML由实体组成,每个实体都有父ID和id。总有一个这样的实体,其父ID = -1,这意味着它是根实体。

我想要一个可以将这种XML转换为HTML UL的XSL,其中描述了父子关系。

例如,对于上面的示例,输出将是:

<ul>
  <li>Name1</li>
    <ul>
    <li>Name2</li>
    <ul>
  <li>Name3</li>
    <ul>
    <li>Name5</li>
    </ul>
   <li>Name4</li>
    </ul>
   </ul>
   </ul>

XML是动态的,实体的数量不是常数,唯一可以保证的是父ID为-1的实体,它将其标记为所有的根实体。

我一直在尝试为此编写XSLT,但最终会遇到长期运行,并且无法考虑解决此问题的任何策略。

请穿救生衣帮忙,

1 个答案:

答案 0 :(得分:2)

使用:

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

  <xsl:template match="/">
    <ul>
      <xsl:apply-templates select="//Entity[property[@type = 'Parent_id'] = -1]"/>
    </ul>
  </xsl:template>
  <xsl:template match="Entity">
    <li>
      <xsl:value-of select="property[@type = 'Name']"/>
    </li>
    <xsl:if test="../Entity[property[@type = 'Parent_id'] = current()/property[@type = 'id']]">
      <ul>
        <xsl:apply-templates select="../Entity[property[@type = 'Parent_id'] = current()/property[@type = 'id']]"/>
      </ul>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

<强>输出

<ul>
  <li>Name1</li>
  <ul>
    <li>Name2</li>
    <ul>
      <li>Name3</li>
      <ul>
        <li>Name5</li>
      </ul>
      <li>Name4</li>
    </ul>
  </ul>
</ul>