1

最も簡単な方法 (PHP 5、XPATH 1.0) で 1 つのノードの最大深度を取得する必要があります。

XML の例:

<node>
    <node id="nodeBase">
        <node>
            <node />
        </node>
        <node>
            <node>
                <node />
            </node>
        </node>
    </node>
</node>
  1. ノードnodeBaseを取得します
  2. nodeBaseから最大深度を取得するための XPATH クエリの実行
  3. 結果は 3 でなければなりません

PHP で複雑なアルゴリズムをコーディングせずにそれを行うことは可能ですか?

ありがとうございました

4

1 に答える 1

1

1. ノード nodeBase を取得します

2. nodeBase から最大深度を取得するための XPATH クエリの実行

3.結果は 3 でなければなりません PHP で複雑なアルゴリズムをコーディングせずにそれを行うことは可能ですか?

XPath 2.0 を使用する場合とは異なり、XPath 1.0 では単一の XPath 式で目的の結果を生成することはできません

最も単純な解決策には、ホスト言語 (この場合は 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

このことから、PHP でアルゴリズムを実装する方法を理解することができます。

完全を期すために、同じ結果を生成する単一の XPath 2.0 式を次に示します。

 max((//*[@id='nodeBase'])[1]//*[not(*)]/count(ancestor::*))
-
 (//*[@id='nodeBase'])[1]/count(ancestor::*)
于 2012-05-10T12:43:12.033 に答える