我在这里遇到了很多挑战......
是否可以使用适用于XML的任何层次结构的XSL代码,将其转换为嵌套的HTML列表?
示例XML:
<Base>
<Parent>
<Child />
<Child>
<ChildOne />
<ChildOne>
<ChildTwo />
<ChildTwo />
</ChildOne>
</Child>
</Parent>
<Parent>
<Child>
<ChildOne>
<ChildTwo>
<ChildThree>
<ChildFour />
</ChildThree>
<ChildThree/>
</ChildTwo>
</ChildOne>
<ChildOne/>
<ChildOne/>
</Child>
<Child/>
</Parent>
</Base>
期望的结果:
<ul>
<li>Parent1
<ul>
<li>Child</li>
<li>Child
<ul>
<li>ChildOne</li>
<li>ChildOne>
<ul>
<li>ChildTwo</li>
<li>ChildTwo</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Parent2
<ul>
<li>Child
<ul>
<li>ChildOne
<ul>
<li>ChildTwo
<ul>
<li>ChildThree
<ul>
<li>ChildFour</li>
</ul>
</li>
<li>ChildThree</li>
</ul>
</li>
</ul>
</li>
<li>ChildOne</li>
<li>ChildOne</li>
</ul>
</li>
<li>Child</li>
</ul>
</li>
</ul>
所以逻辑是如果元素(上层)下面还有其他元素(被抑制的el。) - 被抑制的el。通过<li>name of upper el.<ul>all suppressed el.</ul></li>
获取环绕等等。
我的观点是,这个XSL代码不是通过元素或属性的值或名称,而是通过条件检查,如果有其他元素属于特定元素。
F.e。,如果ChildThree
本身没有ChildFour
,则只有<li>ChildThree>
而不是
<li>ChildThree
<ul>
<li>ChildFour</li>
</ul>
</li>
希望我能清楚地解释清楚。 :)
P.S。这就是它必须在浏览器中查看的方式,或多或少(只是为了给出视觉表示,因为我们人类喜欢看东西。:P)
答案 0 :(得分:3)
使用样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="*[*]">
<li>
<xsl:value-of select="local-name()"/>
<ul>
<xsl:apply-templates/>
</ul>
</li>
</xsl:template>
<xsl:template match="*[not(*)]">
<li>
<xsl:value-of select="local-name()"/>
</li>
</xsl:template>
<xsl:template match="/*" priority="5">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
</xsl:stylesheet>
Saxon 6.5.5转换输入
<Base>
<Parent>
<Child />
<Child>
<ChildOne />
<ChildOne>
<ChildTwo />
<ChildTwo />
</ChildOne>
</Child>
</Parent>
<Parent>
<Child>
<ChildOne>
<ChildTwo>
<ChildThree>
<ChildFour />
</ChildThree>
<ChildThree/>
</ChildTwo>
</ChildOne>
<ChildOne/>
<ChildOne/>
</Child>
<Child/>
</Parent>
</Base>
进入结果
<ul>
<li>Parent
<ul>
<li>Child</li>
<li>Child
<ul>
<li>ChildOne</li>
<li>ChildOne
<ul>
<li>ChildTwo</li>
<li>ChildTwo</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Parent
<ul>
<li>Child
<ul>
<li>ChildOne
<ul>
<li>ChildTwo
<ul>
<li>ChildThree
<ul>
<li>ChildFour</li>
</ul>
</li>
<li>ChildThree</li>
</ul>
</li>
</ul>
</li>
<li>ChildOne</li>
<li>ChildOne</li>
</ul>
</li>
<li>Child</li>
</ul>
</li>
</ul>
答案 1 :(得分:1)
这个XSL样式表让你想要完成。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<!-- Match the Base element, with high priority to avoid matching the more
specific template further down, that matches *[*] -->
<xsl:template match="Base" priority="10">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<!-- Match the Parent element, with high priority to avoid matching the more
specific template further down, that matches *[*] -->
<xsl:template match="Parent" priority="10">
<li>
<!-- Output a Parent element and append it with its position amongst
all Parent elements at this level. -->
<xsl:text>Parent</xsl:text>
<xsl:value-of select="count(preceding-sibling::Parent) + 1"/>
<xsl:apply-templates/>
</li>
</xsl:template>
<!-- Match those elements that have children. -->
<xsl:template match="*[*]">
<li>
<xsl:value-of select="local-name(.)"/>
<ul>
<xsl:apply-templates/>
</ul>
</li>
</xsl:template>
<!-- Match the remaining elements (without children) -->
<xsl:template match="*">
<li>
<xsl:value-of select="local-name(.)"/>
</li>
</xsl:template>
</xsl:stylesheet>
您可以在行动here中看到它。