我必须从XML文档中的每个块中选择4个值中的3个。 到目前为止这是有效的。
但现在我必须限制结果。 行[1]包含从1到300的整数,但我需要的值仅为300。
$xpath = new \DOMXPath($dom);
$this->nodes = $xpath->query("
//row[position()>1]//cell[1]/data
| //row[position()>1]//cell[2]/data
| //row[position()>1]//cell[3]/data
| //row[position()>1]//cell[data<300]
");
XML文档在这里看起来像这样:
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s63"><Data ss:Type="Number">62</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">..</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">Ethiopia PDR</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">Ethiopia PDR</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s63"><Data ss:Type="Number">63</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">EE</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">Estonia</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">the Republic of Estonia</Data></Cell>
</Row>
修改
在您的帮助下,它现在可以但:
$this->nodes = $xpath->query("
//row[position()>1]/cell[data<300]/data
| //row[position()>1]/cell[2]/data
| //row[position()>1]/cell[3]/data
");
但是现在最后有一些查询似乎忽略的行:
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s63"><Data ss:Type="Number">5600</Data></Cell>
<Cell ss:StyleID="s64"/>
<Cell ss:StyleID="s63"><Data ss:Type="String">Antarctic Region</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">Antarctic Region</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s63"><Data ss:Type="Number">5706</Data></Cell>
<Cell ss:StyleID="s64"/>
<Cell ss:StyleID="s63"><Data ss:Type="String">European Union</Data></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="String">European Union</Data></Cell>
</Row>
现在第二个“单元格”为空,查询忽略只打印低于300的数据集。或者更好的是这是一个不想要的结果:
European Union - Antarctic Region
我的结果中还显示了ID超过300的这些内容。 我猜我只能获得行[1] +行[2] +行[3] ???
答案 0 :(得分:0)
//Row[1]//Cell[1]/Data[.<=300]
答案 1 :(得分:0)
在阅读了关于复杂性的评论后(你的查询还可以吗?)试试cell[data<300]/data
,它还返回数据,而不是单元格。
摘要:也许优化的查询类似于
//row[position()>1 and ./cell[1]/data<300]//data
但是你说“4个值中的3个”(并显示前3个)...好的,现在正在......检查是否有,
//row[position()>1 and ./cell[1]/data<300]/cell[position()<4]/data