我正在尝试编写一个xpath表达式,以根据某些条件从xml中获取元素名称。
iam 所追求的是获取具有子节点"fields/enable"的每个元素的元素名称列表。我不知道元素的名称是什么,我没有任何属性可以触发,元素可以是任何 xml 可接受的名称。
在下面的示例中,我对以下结果感兴趣:
ajob
bjob
cjob
我设法获得了我感兴趣的每个节点的标签名称。在此示例中,标签名称与我想要的元素名称完全相同,但我不能依赖标签不会更改。我唯一确定的是元素名称。
->xpath("//wrapper/groups/*/fields/enable/../../label");
我用谷歌搜索了这个,并得到了几次使用if名称()的不同组合的点击。我从来没有设法让 name() 返回任何值的尝试。
->xpath("//wrapper/groups/*/fields//enable/../name(parent::*)");
或
->xpath("name(//wrapper/groups/*/fields/enable/../..)");
我已经简化了下面的XML示例,但基本结构和感兴趣的元素仍然存在
我将不胜感激我能得到的任何帮助。
<?xml version="1.0" encoding="UTF-8"?>
<config>
<wrapper>
<groups>
<ainfo>
<label>Information</label>
</ainfo>
<atimer>
<label>Schedule</label>
<fields>
<time />
<frequency />
</fields>
</atimer>
<ajob>
<label>ajob</label>
<fields>
<enable>1</enable>
</fields>
</ajob>
<btimer>
<label>Schedule</label>
<fields>
<time />
<frequency />
</fields>
</btimer>
<bjob>
<label>bjob</label>
<fields>
<enable>1</enable>
</fields>
</bjob>
<cinfo>
<label>Information</label>
</cinfo>
<cjob>
<label>cjob</label>
<fields>
<enable>1</enable>
</fields>
</cjob>
</groups>
</wrapper>
</config>
对于给定的XML,这里有一个使用PHP,SimpleXML的工作解决方案,以及对你提供的//wrapper/groups/*/fields/enable/../../label
XPath表达式的一个小改动:
<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<config>
<wrapper>
<groups>
<ainfo>
<label>Information</label>
</ainfo>
<atimer>
<label>Schedule</label>
<fields>
<time />
<frequency />
</fields>
</atimer>
<ajob>
<label>ajob</label>
<fields>
<enable>1</enable>
</fields>
</ajob>
<btimer>
<label>Schedule</label>
<fields>
<time />
<frequency />
</fields>
</btimer>
<bjob>
<label>bjob</label>
<fields>
<enable>1</enable>
</fields>
</bjob>
<cinfo>
<label>Information</label>
</cinfo>
<cjob>
<label>cjob</label>
<fields>
<enable>1</enable>
</fields>
</cjob>
</groups>
</wrapper>
</config>
XML;
$sxe = new SimpleXMLElement($xml);
$enabledLabels = $sxe->xpath('//wrapper/groups/*/fields/enable[.=1]/../../label');
foreach ($enabledLabels as $enabledLabel) {
echo "$enabledLabel'n";
}
输出:
ajob
bjob
cjob
下面的XSLT应该能给你你想要的:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="//*[fields/enable=1]">
<xsl:value-of select="name(current())" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
现场观看:http://www.xsltcake.com/slices/JYfpsX/3
您可以使用 xpath 检索一组节点,然后您可以在 PHP 中循环这些节点并在每次迭代中检索节点的名称。PHP DOMNode 类 (http://php.net/manual/en/class.domnode.php) 有一个名为 'nodeName' 的属性。
$sxe = new SimpleXMLElement($xml);
$element = $sxe->xpath("//wrapper/groups//fields[enable=1]/../label");
foreach($element as $node)
{
echo $node,"<br/>";
}