我有一段XML,其中相同的信息可以显示为不同节点的子级.如 :
<root>
<category id=1>
<product id="ABC123" >
<sizes>
<size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
<size name="2XL"/>
<size name="3XL"/>
</sizes>
</product>
</products>
</category>
<category id=2>
<products>
<product id="ABC123" >
<sizes>
<size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
<size name="2XL"/>
<size name="3XL"/>
</sizes>
</product>
<product id="PPP543" >
<sizes>
<size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
</sizes>
</product>
</products>
</category>
我的目标是选择产品ID ABC123的大小并将其存储为数组.我当前的代码是:
$arrTest=array();
foreach($xml->xpath('//root/category/products/product[@id= "'.$productCall.'" ]/sizes/size') as $size){
array_push($arrTest, $size["name"]);
}
$productCall是我要查找的ID.在这种情况下,它是ABC123.
输出为S,M,L,XL,2XL,3XL,S,M,L,XL,2XL,3XL.这意味着它正在读取找到的两个条目.在给定foreach循环的情况下,我期望这样做,但是我似乎无法找到一种方法来获取第一个结果的输出.我尝试添加[0]和[1]:
$y=$xml->xpath('//root/category/products/product[@id= "'.$productCall.'" ][1]/sizes/size');
[0]不返回任何内容,[1]返回相同的结果.
我希望这是一个简单的问题,因为我以前从未真正使用过xpath,所以我错过了一些基本的东西或只是想得太多.
解决方法:
采用:
(/*/*//product[@id='ABC123']/sizes)[1]/size
或使用:
((/*/*/product | /*/*/products/product)/sizes)[1]/size
基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"(/*/*//product[@id='ABC123']/sizes)[1]/size"/>
========
<xsl:copy-of select=
"((/*/*/product | /*/*/products/product)/sizes)[1]/size"/>
</xsl:template>
</xsl:stylesheet>
当将此转换应用于提供的XML文档时(将其更正为格式正确的文档之后):
<root>
<category id="1">
<product id="ABC123" >
<sizes>
<size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
<size name="2XL"/>
<size name="3XL"/>
</sizes>
</product>
</category>
<category id="2">
<products>
<product id="ABC123" >
<sizes>
<size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
<size name="2XL"/>
<size name="3XL"/>
</sizes>
</product>
<product id="PPP543" >
<sizes>
<size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
</sizes>
</product>
</products>
</category>
</root>
计算两个XPath表达式,并将每个表达式中选择的节点(在视觉上已很好地定界)复制到输出中-都正确:
<size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
<size name="2XL"/>
<size name="3XL"/>
========
<size name="S"/>
<size name="M"/>
<size name="L"/>
<size name="XL"/>
<size name="2XL"/>
<size name="3XL"/>
请注意:我希望第二个XPath表达式更有效(在足够大的文档上),因为它不使用//伪运算符.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。