2012-05-10 2 views
1

Мне нужно, чтобы получить глубину макс для одного узла в простом способе (PHP 5, XPATH 1,0)как получить максимальную глубину для одного узла в XPath 1.0

Пример из XML:

<node> 
    <node id="nodeBase"> 
     <node> 
      <node /> 
     </node> 
     <node> 
      <node> 
       <node /> 
      </node> 
     </node> 
    </node> 
</node> 
  1. я Узел nodeBase
  2. Исполнение XPATH запроса, чтобы получить глубину макс от nodeBase
  3. Результат должен быть 0

Возможно ли это сделать без кодирования усложняющего алгоритма в PHP?

Спасибо

ответ

1

1.I получить nodeBase узел

2.Execution из XPATH в запросе, чтобы получить глубину макс от nodeBase

3. Результат должен быть 3 Есть ли возможно ли это сделать без кодирования сложного алгоритма в PHP?

В отличие используя XPath 2.0, полезный результат не возможно производить с одного выражения XPath в XPath 1.0.

Простейшее решение будет включать в себя некоторые вычисления с основного языка (в данном случае PHP).

  1. Вы можете получить все элементы листа, которые являются потомками указанного элемента.

  2. Для каждого из них оценивается count(ancestor::*), а затем в PHP найдет максимальное из них.

  3. Наконец, вычтите из найденной максимальной абсолютной глубины глубину указанного элемента, которая снова count(ancestor::*) оценила этот элемент.

Выражение XPath (необходимо в 1. выше), который выбирает все элементы листа:

//node[@id='nodeBase']//*[not(*)] 

XSLT-1.0 реализации этого алгоритма:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:variable name="vBase" select="//*[@id='nodeBase']"/> 

    <xsl:for-each select="$vBase//*"> 
     <xsl:sort select="count(ancestor::*)" data-type="text" order="descending"/> 

     <xsl:if test="position() = 1"> 
     <xsl:value-of select="count(ancestor::*) - count($vBase/ancestor::*)"/> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

, когда это преобразование применяются на предоставленном документе XML:

<node> 
    <node id="nodeBase"> 
     <node> 
      <node /> 
     </node> 
     <node> 
      <node> 
       <node /> 
      </node> 
     </node> 
    </node> 
</node> 

разыскиваемый, правильный результат получается:

3 

Из этого вы можете получить представление о том, как реализовать алгоритм thm в PHP.

Просто для полноты картины, вот один XPath 2.0 выражение производит один и тот же результат:

max((//*[@id='nodeBase'])[1]//*[not(*)]/count(ancestor::*)) 
- 
(//*[@id='nodeBase'])[1]/count(ancestor::*) 
+0

Благодаря это работает, но жаль, что XPATH2.0 не существует в PHP ... – Epharion

+0

@ Эфарион: Нам нужно показать продавцам языков программирования, которым требуется большое большинство разработчиков XPath 2.0 (и XSLT 2.0). В настоящее время XPath 3.0 собирается стать официальной Рекомендацией W3C (она находится в состоянии «последнего вызова») - это означает, что поставщики PL очень запоздали в игре - они все еще не реализовали 2.0. –

Смежные вопросы