英文:
PHP SimpleXML Xpath Relative to Current Node Only
问题
我正在尝试运行一个简单的PHP SimpleXML命令,使用xpath。但是,我的//w:pStyle
XPath选择了整个文档中的所有节点,而不是相对于正在循环的//w:p
节点。**注意:**我希望保持两个xpaths的循环分开。我不想将它们放在一个xpath下,即如果段落中存在样式节点,则首先循环段落节点,然后仅循环该段落中的样式节点。解决方法是什么?
英文:
I am trying to run a simple PHP SimpleXML command using xpath. But, my //w:pStyle
Xpath is getting all nodes in the entire document and not the ones relative to the node //w:p
thats being looped. Note: I want to keep the loop for both xpaths separate. I do not want to have both under one xpath i.e. loop through the paragraph nodes and then loop the styles nodes only in that paragraph if they exist.
foreach($file->xpath('//w:p') as $p){
echo 'Paragraph';
$styles=$p->xpath('//w:pStyle');
foreach($styles as $style){echo 'Style';}
}
The xpath //w:pStyle
selects all the w:pStyle
nodes. I would like instead for it to select the ones that are relative to the paragraph node. What is the solution here?
答案1
得分: 1
你的错误在于,在表达式前面加上 //
来选择整个文档中的元素。你应该使用 .//
替代,像这样:
$styles=$p->xpath('.//w:pStyle');
这样会选择 w:p
元素的所有 w:pStyle
后代。
如果你只想选择 w:p
的直接子元素,可以使用:
$styles=$p->xpath('w:pStyle');
因为 w:pStyle
是 w:pPr
的子元素,而 w:pPr
是 w:p
的子元素,所以你可以使用:
$styles=$p->xpath('w:pPr/w:pStyle');
英文:
Your mistake is, that you are selecting elements from the whole document by prefixing the expression with //
. You should prefix it with .//
instead, like this
$styles=$p->xpath('.//w:pStyle');
which will select all w:pStyle
descendants of the w:p
element.
If you only want direct children of w:p
, use
$styles=$p->xpath('w:pStyle');
since w:pStyle
is a child of w:pPr
which is a child of w:p
, you could use
$styles=$p->xpath('w:pPr/w:pStyle');
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论