我有以下xml
<root>
<s>
<name>self-1</name>
<parents>
<s>
<name>p-1-2</name>
<parents>
<s>
<name>p-1-2-1</name>
<parents>
<s>
<name>p-1-2-1-1</name>
</s>
</parents>
</s>
<s>
<name>p-1-2-2</name>
</s>
</parents>
</s>
</parents>
</s>
</root>
我需要编写一个xslt1来解析xml以产生如下所示的输出,目标是首先处理所有父节点,最后处理节点self-1。请给我一些建议。
<ul>
<li>p-1-2-1-1</li>
<ul>
<li>p-1-2-1</li>
<li>p-1-2-2</li>
<ul>
<li>p-1-2</li>
<ul>
<!-- self -->
<li>self-1</li>
</ul>
</ul>
</ul>
</ul>
答案 0 :(得分:1)
以下是关于如何解决这个问题的建议:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="descendant::parents[not(s/parents)]"/>
</xsl:template>
<xsl:template match="parents | root">
<ul>
<xsl:apply-templates select="s/name"/>
<xsl:variable name="p" select="parent::s/parent::parents | parent::s/parent::root"/>
<xsl:if test="$p">
<li>
<xsl:apply-templates select="$p"/>
</li>
</xsl:if>
</ul>
</xsl:template>
<xsl:template match="name">
<li>
<xsl:value-of select="."/>
</li>
</xsl:template>
</xsl:stylesheet>
输出
<ul>
<li>p-1-2-1-1</li>
<li>
<ul>
<li>p-1-2-1</li>
<li>p-1-2-2</li>
<li>
<ul>
<li>p-1-2</li>
<li>
<ul>
<li>self-1</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
这并不是您要求的,但这是故意做的:您的示例包含ul
个ul
个子元素,但HTML中不允许这样(http://www.w3。组织/ TR / HTML4 /结构/ lists.html#H-10.2)。因此,我的样式表通过确保所有ul
只有li
个子元素来确保结果是有效的HTML。
答案 1 :(得分:0)
处理多个节点<s>
我将模板<xsl:template match="parents | root">
更新为以下内容:
<xsl:template match="parents | root">
<ul>
<xsl:apply-templates select="s/name"/>
<xsl:choose>
<xsl:when test="parent::s/parent::parents">
<xsl:variable name="p" select="parent::s/parent::parents"/>
<li><xsl:apply-templates select="$p"/></li>
</xsl:when>
<xsl:when test="parent::s/parent::root">
<xsl:variable name="p" select="parent::s/parent::root"/>
<li><xsl:apply-templates select="$p"/></li>
</xsl:when>
</xsl:choose>
</ul>
</xsl:template>