选择使用XPath第一个结果的孩子(Selecting the children of first

2019-07-02 17:11发布

我有一块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工作过一件简单的事情。

Answer 1:

使用方法

(/*/*//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表达式更有效率(上足够大的文件),因为它不使用//伪运营商。



文章来源: Selecting the children of first result using xpath