用于计算特定子树中的叶节点的简明表达式

时间:2013-10-27 13:17:34

标签: xslt xpath

在我尝试回答问题XSLT - Tricky Transformation时,我遇到了以下任务:

  

对于每个标记<MMM>计算第二个标记中的叶节点数   <MMM>子标记。

将“叶节点”定义为<MMM>标记,其中没有其他<MMM>标记作为子标记。但是,它可能有其他标签作为孩子。

我最后得到了两个表达式:

<xsl:variable name="just_children" select="count(MMM[position() = 2 and count(MMM) = 0])"/>
<xsl:variable name="grandchildren_and_below" select="count(MMM[2]//MMM[count(MMM) = 0])"/>

第一个计算第二个孩子的叶子,第二个孩子的所有祖先的叶子。我无法将这两者合并为一个表达式(除了我必须做的明显总结:-))。不知何故,我不能使节点数组索引选择器[2],附加条件count(MMM) = 0和祖先路径`//'适合同一个表达式。

那么,是否有更简洁(也可能更优雅)的方式来编写这个表达式?

非常感谢!

对于测试,您可以使用此输入文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<MMM>
  <MMM>
    <MMM>
      <MMM/>
      <MMM/>
    </MMM>    
    <MMM>
      <MMM/>
      <MMM>
        <MMM/>
      </MMM>
    </MMM>
  </MMM>
  <MMM>
    <MMM/>
  </MMM>
</MMM>

以及以下XSLT表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet 
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>

  <xsl:template match="MMM">
    <xsl:variable name="just_children" select="count(MMM[position() = 2 and count(MMM) = 0])"/>
    <xsl:variable name="grandchildren_and_below" select="count(MMM[2]//MMM[count(MMM) = 0])"/>
    <MMM just_children="{$just_children}" grandchildren_and_below="{$grandchildren_and_below}">
      <xsl:apply-templates/>
    </MMM>    
  </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

您的 just_children 变量可以写成:

<xsl:variable name="just_children" select="count(MMM[2][not(MMM)])"/>

您的 grandchildren_and_below 变量可以写成:

<xsl:variable name="grandchildren_and_below" select="count(MMM[2]//MMM[not(MMM)])"/>

要将它们组合在一起,您可以使用后代或自我轴,如此

<xsl:variable name="all" select="count(MMM[2]//descendant-or-self::MMM[not(MMM)])"/>