Как найти самый глубокий узел (шаги) - Xpath - php - xml - - PullRequest
0 голосов
/ 27 марта 2012


Привет

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

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

С уважением

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

1 Ответ

1 голос
/ 27 марта 2012

С 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...