2012-04-20 307 views
4

这是我目前使用的一些代码。当我需要帮助的$bn_name_search$bn_id_search从xpath中排除节点查询

$xpath_base='/ItemSearchResponse/Items/Item['; 
for ($i = 1; $i<=10; $i++) 
    { 
    $curr_item_base=$xpath_base.$i.']'; 
    $bn_name_search=$curr_item_base.'/BrowseNodes//BrowseNode/Name/text()'; 
    $bn_id_search=$curr_item_base.'/BrowseNodes//BrowseNode/BrowseNodeId/text()'; 
    $bn_names=$parsed->xpath($bn_name_search); 
    $bn_ids=$parsed->xpath($bn_id_search); 
    } 

这给了我所有的browsnode名称以及所有broswnode IDS。我现在想要做的只是找到不是“所有产品”的browsenode名称“BrowseNode/Name/”,只有browsnode ID“BrowseNode/BrowseNodeId/”共享一个名称不是“所有产品”的“BrowseNode/”必须测试BrowseNode/Name的存在。如果有ID,它不会是空白的。如果我可以把两个负面的表达,它会更好。我会忽略那些名字是“所有产品”,那些名字是“部门”

编辑: 这里的XML块:它说:“&lt;Name&gt;Departments&lt;/Name&gt;”,我想排除名称它是ID。如果我有一个类似“&lt;Name&gt;All Products&lt;/Name&gt;”的相似字样,我还想排除该名称,它是ID。 (由ID,我的意思是&lt;BrowseNodeId&gt;

<BrowseNodes> 
    <BrowseNode> 
    <BrowseNodeId>2346727011</BrowseNodeId> 
    <Name>Casual</Name> 
    <Ancestors> 
     <BrowseNode> 
     <BrowseNodeId>1045024</BrowseNodeId> 
     <Name>Dresses</Name> 
     <Ancestors> 
      <BrowseNode> 
      <BrowseNodeId>1040660</BrowseNodeId> 
      <Name>Women</Name> 
      <Ancestors> 
       <BrowseNode> 
       <BrowseNodeId>1036682</BrowseNodeId> 
       <Name>Departments</Name> 
       <IsCategoryRoot>1</IsCategoryRoot> 
       <Ancestors> 
        <BrowseNode> 
        <BrowseNodeId>1036592</BrowseNodeId> 
        <Name>Clothing &amp; Accessories</Name> 
        </BrowseNode> 
       </Ancestors> 
       </BrowseNode> 
      </Ancestors> 
      </BrowseNode> 
     </Ancestors> 
     </BrowseNode> 
    </Ancestors> 
    </BrowseNode> 
</BrowseNodes> 
+0

感谢您的答案。当我开始工作时,我会尝试其中的一个或两个。 – TecBrat 2012-04-23 02:17:18

+0

仅供将来参考,如果您想快速回答,最好尽可能多地发布信息,并尽可能输入/输出。 – JWiley 2012-04-23 11:40:16

+0

以下任意数量的答案都有效。我的测试代码中有一个错误,所以没有任何工作。最后,最简单的答案(在我眼中)是对我有用的。再次感谢所有提供答案的人! – TecBrat 2012-04-23 14:47:56

回答

2

你去那里:

$nodes = $parsed->xpath("//BrowseNode[Name!='Departments' and Name!='All Products']"); 
foreach ($nodes as $node) { 
    echo "Id: {$node->BrowseNodeId}, name: {$node->Name}\n"; 
} 
+0

我认为你钉了它!我花了一段时间,因为我的测试代码中有另一个逻辑错误,但这里是我的实际字符串:'“/ BrowseNodes // BrowseNode [Name!='Departments'and Name!='All Products']/Name/text )“;'和'”/ BrowseNodes // BrowseNode [Name!='Departments'and Name!='All Products']/BrowseNodeId/text()“' – TecBrat 2012-04-23 14:44:17

2

没有看到你的XML是如何构成的,我想出了使用XPath来什么,我还以为你要怎样做。我也不太确定BrowseNodeId是否“共享”一个browsenode名称,我认为这意味着为BrowseNodeId s提供所有BrowseNode的名称设置为此。

我结合你的XPath在PHP之外的想象更好:

/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode/Name/text() 
/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode/ 

组合的解决方案:

/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode/Name[text()!='All Products']/text() 
/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode[Name/text()!='All Departments']/BrowseNodeId/text() 

PHP的解决方案:

$xpath_base='/ItemSearchResponse/Items/Item['; 
for ($i = 1; $i<=10; $i++) 
    { 
    $curr_item_base=$xpath_base.$i.']'; 
    $bn_name_search=$curr_item_base.'/BrowseNodes//BrowseNode/Name[text()!='All Products']'; 
    $bn_id_search=$curr_item_base.'/BrowseNodes//BrowseNode[Name/text()!='All Departments']/BrowseNodeId/text()'; 
    $bn_names=$parsed->xpath($bn_name_search); 
    $bn_ids=$parsed->xpath($bn_id_search); 
    } 

更新 要结合xpath,你可以使用串连|

/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode[Name/text()!=\'Departments\' and Name/text()!=\'All Products\']/BrowseNodeId/text() | 
/ItemSearchResponse/Items/Item[i]/BrowseNodes//BrowseNode/Name[text()!=\'All Products\' and text()!=\'Departments\'] 

PHP: (更新)

$bn_combined_search=$curr_item_base.'/BrowseNodes//BrowseNode[Name/text()!=\'Departments\' and Name/text()!=\'All Products\']/BrowseNodeId/text() |'.$curr_item_base.'/BrowseNodes//BrowseNode/Name[text()!=\'All Products\' and text()!=\'Departments\']'; 

如果我犯了一个错误的假设,发布一些你的XML,并阐述你正在寻找的解决方案。希望这可以帮助!

+0

请看我的问题。我正在用XML中的一段代码更新它。 – TecBrat 2012-04-20 21:46:40

+0

您是否期待Casual /连衣裙/女士/服装和配饰的名称/ ID?或者,部门/所有产品的子元素是否也被查询留下? – JWiley 2012-04-23 11:42:03

2

使用

//BrowseNode 
     [not(contains('|Departments|All Products|', 
        concat('|', Name, '|') 
        ) 
     ) 
     ]/Name 

这个表达式选择任何Name元素是BrowseNode元素的子元素,其字符串值不是一个字符串"Departments""All Products"

使用

//BrowseNode 
     [not(contains('|Departments|All Products|', 
        concat('|', Name, '|') 
        ) 
     ) 
     ] 
     /BrowseNodeId 

这将选择任何BrowseNodeId元素是BrowseNode元素的子元素,并具有Name兄弟,其字符串值不是字符串"Departments""All Products"之一。

XSLT - 基于验证

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "//BrowseNode 
     [not(contains('|Departments|All Products|', 
        concat('|', Name, '|') 
        ) 
     ) 
     ]/Name 
     "/> 
================= 

    <xsl:copy-of select= 
    "//BrowseNode 
     [not(contains('|Departments|All Products|', 
        concat('|', Name, '|') 
        ) 
     ) 
     ] 
     /BrowseNodeId 
     "/> 
</xsl:template> 
</xsl:stylesheet> 

当这个变换所提供的XML文档应用:

<BrowseNodes> 
    <BrowseNode> 
     <BrowseNodeId>2346727011</BrowseNodeId> 
     <Name>Casual</Name> 
     <Ancestors> 
      <BrowseNode> 
       <BrowseNodeId>1045024</BrowseNodeId> 
       <Name>Dresses</Name> 
       <Ancestors> 
        <BrowseNode> 
         <BrowseNodeId>1040660</BrowseNodeId> 
         <Name>Women</Name> 
         <Ancestors> 
          <BrowseNode> 
           <BrowseNodeId>1036682</BrowseNodeId> 
           <Name>Departments</Name> 
           <IsCategoryRoot>1</IsCategoryRoot> 
           <Ancestors> 
            <BrowseNode> 
             <BrowseNodeId>1036592</BrowseNodeId> 
             <Name>Clothing &amp; Accessories</Name> 
            </BrowseNode> 
           </Ancestors> 
          </BrowseNode> 
         </Ancestors> 
        </BrowseNode> 
       </Ancestors> 
      </BrowseNode> 
     </Ancestors> 
    </BrowseNode> 
</BrowseNodes> 

两个的XPath表达式,并且它们的结果(分离由"========"将字符串复制到输出

我们可以因此从转换的结果证实正是希望NameBrowseNodeId元素被选中:

<Name>Casual</Name> 
<Name>Dresses</Name> 
<Name>Women</Name> 
<Name>Clothing &amp; Accessories</Name> 
================= 

<BrowseNodeId>2346727011</BrowseNodeId> 
<BrowseNodeId>1045024</BrowseNodeId> 
<BrowseNodeId>1040660</BrowseNodeId> 
<BrowseNodeId>1036592</BrowseNodeId>