1. ノード nodeBase を取得します
2. nodeBase から最大深度を取得するための XPATH クエリの実行
3.結果は 3 でなければなりません PHP で複雑なアルゴリズムをコーディングせずにそれを行うことは可能ですか?
XPath 2.0 を使用する場合とは異なり、XPath 1.0 では単一の XPath 式で目的の結果を生成することはできません。
最も単純な解決策には、ホスト言語 (この場合は 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
このことから、PHP でアルゴリズムを実装する方法を理解することができます。
完全を期すために、同じ結果を生成する単一の XPath 2.0 式を次に示します。
max((//*[@id='nodeBase'])[1]//*[not(*)]/count(ancestor::*))
-
(//*[@id='nodeBase'])[1]/count(ancestor::*)