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

而已。

我查看了本网站和其他网站上提供的各种解决方案,但它们都没有奏效。

我确实阅读了有关 Xpath 函数和 distinct-values 函数的信息,但我找不到一种方法来识别我正在运行的 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 回答