1.I получить nodeBase узел
2.Execution из XPATH в запросе, чтобы получить глубину макс от nodeBase
3. Результат должен быть 3 Есть ли возможно ли это сделать без кодирования сложного алгоритма в PHP?
В отличие используя XPath 2.0, полезный результат не возможно производить с одного выражения XPath в XPath 1.0.
Простейшее решение будет включать в себя некоторые вычисления с основного языка (в данном случае PHP).
Вы можете получить все элементы листа, которые являются потомками указанного элемента.
Для каждого из них оценивается count(ancestor::*)
, а затем в PHP найдет максимальное из них.
Наконец, вычтите из найденной максимальной абсолютной глубины глубину указанного элемента, которая снова 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::*)
Благодаря это работает, но жаль, что XPATH2.0 не существует в PHP ... – Epharion
@ Эфарион: Нам нужно показать продавцам языков программирования, которым требуется большое большинство разработчиков XPath 2.0 (и XSLT 2.0). В настоящее время XPath 3.0 собирается стать официальной Рекомендацией W3C (она находится в состоянии «последнего вызова») - это означает, что поставщики PL очень запоздали в игре - они все еще не реализовали 2.0. –