Приветствую
Как вы находите самый глубокий узел? Итак, для этого примера String будет самым глубоким узлом:
и результат, который я хочу, – 5
<org.olat.course.nodes.STCourseNode> 0 <ident>81473730700165</ident> 1 <type>st</type> <shortTitle>General Information</shortTitle> <moduleConfiguration> 2 <config> 3 <entry> 4 <string>allowRelativeLinks</string> 5 <--- <string>false</string> </entry> <entry> <string>file</string> <string>/kgalgemeneinformatie.html</string> </entry> <entry> <string>configversion</string> <int>3</int> </entry> <entry> <string>display</string> <string>file</string> </entry> </config> </moduleConfiguration> </org.olat.course.nodes.STCourseNode>
Примечание. Я использую php, xpath
Другие возможности также приветствуются 🙂
С уважением
Дитер Вербеем
С 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::*)
вычислений 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