XSLT:父节点的属性条件下的输出列表
问题描述:
我很努力地创建一个列表,以显示父节点('文件夹')属性'折叠'为'是'或'没有'。 结果应仅显示列表的前两个级别,而不显示如下所示的第三个级别。XSLT:父节点的属性条件下的输出列表
- 1st。级别:显示
- 2nd。级别:显示
- 3rd。等级:无显示
的想法是与<xsl:if test="not(parent::yes)">
检查“folder'属性<folder folded="yes">
。 这应该有资格获得第三名。级别不显示,但不知何故,它不会做我想做的事情。 我可能使用错误的构造和/或语法。 援助非常感谢,谢谢。
一些内容的XML结构:
<xbel>
<folder folded="yes">
<level>1</level>
<title>bookmarks</title>
<desc>my bookmarks</desc>
<folder folded="no">
<level>2</level>
<title>Android</title>
<desc>my Android</desc>
<bookmark href="http://www.phonesreview.co.uk/">
<title>HTC Sync 3.0.5422 Update: Aria, Desire, Hero, Legend</title>
<desc>The new HTC Sync 3.0.5422 update will be most welcome...</desc>
</bookmark>
<folder folded="no">
<level>3</level>
<title>Apps</title>
<desc>Android Apps</desc>
<bookmark href="http://www.androidzoom.com/">
<title>Android Communication Apps</title>
<desc>Download Communication Apps for Android.</desc>
</bookmark>
<bookmark href="http://www.htc.com/">
<title>HTC - Android</title>
<desc>Apps for HTC-Android.</desc>
</bookmark>
</folder>
</folder>
</folder>
</xbel>
的XSLT:
<!--creates a nested list of elements named 'folder'-->
<xsl:template match="folder" mode="linklist">
<li>
<xsl:if test="folder/level = 2">
Level:<xsl:value-of select="level"/>/
Title:<xsl:value-of select="title"/>/
Desc:<xsl:value-of select="desc"/>
<ul>
<xsl:apply-templates mode="linklist" />
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="bookmark" mode="linklist">
<li> <!-- this bookmark is just another item in the list of bookmarks -->
<!-- the title -->
<a rel="nofollow" href="{@href}"><xsl:value-of select="title"/></a>
<!-- the description -->
<xsl:if test="desc">
<span class="bookmarkDesc">
<xsl:value-of select="desc"/>
</span>
</xsl:if>
</li>
</xsl:template>
样式表HTML
<body>
<ul>
<xsl:apply-templates mode="linklist" />
</ul>
</body>
所生成的输出(级别:1-3)
Level:1/Title:bookmarks/Desc:my bookmarks
Level:2/Title:Android/Desc:my Android
HTC Sync 3.0.5422 Update: Aria, Desire, Hero, Legend ...
Level:3/Title:Apps/Desc:Android Apps
Android Communication AppsDownload Communication Apps for Android.
HTC - AndroidApps for HTC-Android.
的预期输出:(级别:1-2)
Level:1/Title:bookmarks/Desc:my bookmarks
Level:2/Title:Android/Desc:my Android
HTC Sync 3.0.5422 Update: Aria, Desire, Hero, Legend ...
我尝试这样做模板,但其输出所述最后两个节点,我需要两个第一个节点。
<xsl:template match="folder[parent::folder/@folded = 'yes']" mode="linklist">
答
最简单的变化,你可以做,以防止展开folder
元素的处理是添加燕子他们空的模板(即不产生输出):
<xsl:template match="folder[@folded='no']" mode="linklist"/>
所有folder
元素没有一个folded
属性等于no
将使用您现有的模板进行处理;那些做的将被这个新的捕获。
相反,如果你想处理具有每个folder
元素或者自己的folded
属性等于yes
或其父的(如在所更新XML实例),然后用下面的模板:
<xsl:template match="folder[@folded='yes' or ../@folded='yes']" mode="linklist">
<!-- body elided -->
</xsl:template>
你可能还需要包含一个空的模板,用于隐藏所有其他folder
元素:
<xsl:template match="folder" mode="linklist" />
谢谢:请注意第二个。要显示节点具有属性'@折叠=“no''及其父仅具有属性'@折叠=” yes'' – snahl
@snahl - 它没有在我回答的时间。您已编辑。一旦理解了这些变更的要求,我就可以更新我的答案。您只想输出“折叠”属性为“是”或其父文件夹具有“折叠”属性等于“是”的文件夹。是对的吗? –
正确,我在阅读您的回复后编辑了XML。目标是仅输出那些'父文件夹'具有折叠属性等于'是'的文件夹。 – snahl