选择具有特定后代的节点

时间:2013-01-08 20:01:46

标签: xslt xpath

我有一个包含多个div的xhtml页面。 这样:

 <xsl:template match="div[@class = 'toc']">

选择我感兴趣的div(所有这些都包含无序列表 - ul)。现在我想只选择那些包含两个ul元素级别的div。

一般情况下:如何选择具有特定类型子节点的节点?

我试过这样的事情:

<xsl:apply-templates select="body/div[@class = 'toc']/ul/li/ul" />

                   ...

<xsl:template match="div[@class = 'toc']/ul/li/ul">    
  <xsl:apply-templates mode="final_template" select="../../.."/> 
</xsl:template>

<xsl:template name="final_template" match="div">
        ...
</xsl:template>

但它不起作用。更重要的是,我认为必须有一个更清洁的方法解决这个问题。

1 个答案:

答案 0 :(得分:2)

通常,选择具有特定子节点的节点:

NodeToSelect[childName]

选择具有某些后代的节点:

NodeToSelect[.//descendantName]

请根据您的情况尝试此路径:

div[@class = 'toc'][.//ul//ul]

对于XSLT,这可能是一个很好的方法:

<xsl:apply-templates select="body/div[@class = 'toc'][.//ul//ul]" mode="twoUlDescendants" />

                   ...

<xsl:template match="div" mode="twoUlDescendants">    
   <!-- Work with div here. -->
</xsl:template>

您可以将模式“twoUlDescendants”的名称更改为更准确地描述这些特定div的用途的名称。