XSLT1:首先从最深的节点开始,将XML节点转换为Html列表
我有下面的xmlXSLT1:首先从最深的节点开始,将XML节点转换为Html列表,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有下面的xml <root> <s> <name>self-1</name> <parents> <s> <name>p-1-2</name> <parents>
<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>
自我1
p-1-2
p-1-2-1
p-1-2-1-1
p-1-2-2
我需要编写一个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>
- p-1-2-1-1
- p-1-2-1
- p-1-2-2
- p-1-2
- 自我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>
- p-1-2-1-1
-
- p-1-2-1
- p-1-2-2
-
- p-1-2
-
- 自我1
这并不完全是您所要求的,但这是有意的:您的示例中有
ul
元素和ul
子元素,但这在HTML中是不允许的(http://www.w3.org/TR/html4/struct/lists.html#h-10.2). 因此,我的样式表通过确保任何ul
都只有li
子元素来确保结果是有效的HTML。处理多个节点
我将模板
更新为如下内容:
<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>
非常感谢Martin,我完全忘记了我可以使用后代轴