4

ここに私が現在使用しているいくつかのコードがあります。助けが必要な場所$bn_name_search$bn_id_search

$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 ID が得られます。ここでやりたいBrowseNode/Name/ことは、「すべての製品」ではないブラウズノード名 " " だけを見つけ、ブラウズノード ID " BrowseNode/BrowseNodeId/" だけが "すべての製品" ではない名前と " " を共有するBrowseNode/ことです。テストする必要はありませんの存在のためにBrowseNode/Name。IDがあれば空欄にはなりません。否定的な表現を 2 つ入れることができれば、さらに良いでしょう。名前が「すべての製品」および「部門」の名前のものは省略します

編集: ここに 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>
4

3 に答える 3

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の子であり、文字列値が文字列または文字列のいずれでもない兄弟を持つ要素が選択されます。BrowseNodeName"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>

2 つの XPath 式が評価され、その結果 (文字列で区切られたもの)"========"が出力にコピーされます

Nameしたがって、変換の結果から、必要な要素とBrowseNodeId要素が正確に選択されていることを確認できます。

<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>
于 2012-04-21T04:03:36.280 に答える
2

あなたのxmlがどのように構造化されているかを知らずに、私はあなたがやろうとしていると思っていたxpathを思いつきました。BrowseNodeIdまた、ブラウズノード名を「共有」することについてもよくわかりませんでした。これは、名前がこれに設定されているBrowseNodeIdすべてBrowseNodeの に を与えることを意味すると思いました。

視覚化するために、php の外で xpath を組み合わせました。

/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 を結合するには、 concatenate を使用できます|

/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 の一部を投稿し、探しているソリューションについて詳しく説明してください。お役に立てれば!

于 2012-04-20T18:35:28.447 に答える
2

どうぞ:

$nodes = $parsed->xpath("//BrowseNode[Name!='Departments' and Name!='All Products']");
foreach ($nodes as $node) {
    echo "Id: {$node->BrowseNodeId}, name: {$node->Name}\n";
}
于 2012-04-20T22:48:48.233 に答える