在我尝试回答问题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>
答案 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)])"/>