2

事前にご支援いただきありがとうございます。このフォーラムと www を検索してこれに対する回答を探しましたが、簡単な回答が見つかりません。

属性の一意の値のみを抽出する XML ファイルから結果を返そうとしているだけです。

XML サンプル ファイル:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<computers>
    <restults>
   <computer id="1" group_id="a" model_group="acer" name="Acer 1 GB" />
   <computer id="2" group_id="a" model_group="acer" name="Acer 2 GB" />
   <computer id="3" group_id="b" model_group="acer" name="Acer 3 GB" />
   <computer id="4" group_id="c" model_group="acer" name="Acer 4 GB"/>
   <computer id="5" group_id="c" model_group="acer" name="Acer 6 GB" />
   <computer id="6" group_id="d" model_group="acer" name="Acer 8 GB" />
   <computer id="7" group_id="d" model_group="acer" name="Acer 16 GB" />
   <computer id="8" group_id="d" model_group="acer" name="Acer 32 GB" />
   <computer id="9" group_id="e" model_group="acer" name="Acer 48 GB" />
    </restults>
</computers>

私が望むのは、phpスクリプトがXMLファイルを実行し、一意のものだけを提示することです"group_id" values. ie: a,b,c,d,e

これ以上何もない。

この Web サイトや他のサイトで提供されているさまざまなソリューションを調べましたが、うまくいきませんでした。

Xpath関数と個別値関数について読みましたが、実行しているXpathのバージョンを特定する方法が見つかりませんか? この関数は Xpath 2.0 でのみ使用できることを知っています。

4

1 に答える 1

1

XPath 1.0のみを使用する場合、私が知っている唯一の解決策は、以前のすべてのノードで同じ値をチェックし、見つかった場合はこのノードを除外することです。

<?php
$e = new SimpleXMLElement(data());
foreach( $e->xpath('/computers/restults/computer[not(@group_id=preceding-sibling::computer/@group_id)]/@group_id') as $n ) {
    echo $n, "\n";
}

function data() {
    return <<< eox
<computers>
    <restults>
        <computer id="1" group_id="a" model_group="acer" name="Acer 1 GB" />
        <computer id="2" group_id="a" model_group="acer" name="Acer 2 GB" />
        <computer id="3" group_id="b" model_group="acer" name="Acer 3 GB" />
        <computer id="4" group_id="c" model_group="acer" name="Acer 4 GB"/>
        <computer id="5" group_id="c" model_group="acer" name="Acer 6 GB" />
        <computer id="6" group_id="d" model_group="acer" name="Acer 8 GB" />
        <computer id="7" group_id="d" model_group="acer" name="Acer 16 GB" />
        <computer id="8" group_id="d" model_group="acer" name="Acer 32 GB" />
        <computer id="9" group_id="e" model_group="acer" name="Acer 48 GB" />
    </restults>
</computers>
eox;
}

XSLT <2.0を使用する場合、ここで役立つ可能性のあるMuenchianグループ化と呼ばれる方法があります。

大規模なデータセットに対して両方のアプローチをテストしていません。それらはかなり時間/メモリを消費するかもしれません...

于 2013-03-04T10:02:37.997 に答える