2012-04-20 94 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>