1

我有以下示例 XML:

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

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

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

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

XML 由实体组成,每个实体都有一个父 ID 和一个 ID。总有一个这样的实体,其 Parent 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,但最终以长期运行的方式结束,并且无法想到任何解决此问题的策略。

请帮忙扔救生衣,

4

1 回答 1

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>
于 2013-10-20T22:56:56.313 回答