Как вы находите самый глубокий узел (шаги) – Xpath – php – xml –

Приветствую

Как вы находите самый глубокий узел? Итак, для этого примера 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

Другие возможности также приветствуются 🙂

С уважением

Дитер Вербеем

Solutions Collecting From Web of "Как вы находите самый глубокий узел (шаги) – Xpath – php – xml –"

С 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