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" /> 
+0

谢谢:请注意第二个。要显示节点具有属性'@折叠=“no''及其父仅具有属性'@折叠=” yes'' – snahl

+0

@snahl - 它没有在我回答的时间。您已编辑。一旦理解了这些变更的要求,我就可以更新我的答案。您只想输出“折叠”属性为“是”或其父文件夹具有“折叠”属性等于“是”的文件夹。是对的吗? –

+0

正确,我在阅读您的回复后编辑了XML。目标是仅输出那些'父文件夹'具有折叠属性等于'是'的文件夹。 – snahl