我有以下示例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,但最终会遇到长期运行,并且无法考虑解决此问题的任何策略。
请穿救生衣帮忙,
答案 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>