С XPath 2.0 вы можете написать одно выражение XPath, как я думаю, как max(descendant::*[not(*)]/count(ancestor::*))
.С XPath 1.0 вы можете найти узел с XSLT в качестве языка хоста, как в
<xsl:template match="/">
<xsl:for-each select="descendant::*[not(*)]">
<xsl:sort select="count(ancestor::*)" data-type="number" order="descending"/>
<xsl:if test="position() = 1">
<xsl:value-of select="count(ancestor::*)"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
Если вы используете PHP в качестве языка "хоста" для XPath, вы, вероятно, можете написать нечто похожее с циклом над descendant::*[not(*)]
элементы, не имеющие дочерних элементов и вычисляющие count(ancestor::*)
для каждого из них и сохраняющие максимальное значение.
[править] Вот некоторая попытка PHP:
$xpath = new DOMXPath($doc);
$leafElements = $xpath->query("descendant::*[not(*)]");
$max = 0;
foreach ($leafElements as $el) {
$count = $xpath->evaluate("count(ancestor::*)", $el);
if ($count > $max) {
$max = $count;
}
}
// now use $max here