3

私は子供用の靴の種類を含む大きなファイルをフィルタリングしています。男性は女性と同じくらいウェルです。

ここで、特定の種類の女性の靴を除外したいのですが、次のxpathは機能しますが、使用しているプログラムにはxpathの長さの制限があります。したがって、このxpathを構築するためのより短い/より効率的な方法があるかどうか疑問に思います

/Products/Product[contains(CategoryPath/ProductCategoryPath,'Halbschuhe') and contains(CategoryPath/ProductCategoryPath,'Damen') or  contains(CategoryPath/ProductCategoryPath,'Sneaker') and contains(CategoryPath/ProductCategoryPath,'Damen') or contains(CategoryPath/ProductCategoryPath,'Ballerinas') and contains(CategoryPath/ProductCategoryPath,'Damen')]

編集:要求されたファイルのサンプルを追加

<Products>
    <!-- snip -->
    <Product ProgramID="4875" ArticleNumber="GO1-f05-0001-12">
        <CategoryPath>
            <ProductCategoryID>34857489</ProductCategoryID>
            <ProductCategoryPath>Damen &gt; Sale &gt; Schuhe &gt; Sneaker &gt; Sneaker Low</ProductCategoryPath>
            <AffilinetProductCategoryPath>Kleidung &amp; Accessoires?</AffilinetProductCategoryPath>
        </CategoryPath>
        <Price>
            <DisplayPrice>40.95 EUR</DisplayPrice>
            <Price>40.95</Price>
        </Price>
    </Product>
    <!-- snip -->
</Products>
4

2 に答える 2

7

XPath 2.0 を利用できる場合は、matches()関数を試してみるかtokenize()、Ranon の素晴らしい回答で提案されているように試してみてください。

XPath 1.0 では、式を短縮する 1 つの方法は次のようになります。

/Products/Product[
    CategoryPath/ProductCategoryPath[
        contains(., 'Damen')
            and (  contains(., 'Halbschuhe')
                or contains(.,    'Sneaker')
                or contains(., 'Ballerinas') )] ]

簡単にコピーして貼り付けるための便利なワンライナー:

/Products/Product[CategoryPath/ProductCategoryPath[contains(.,'Damen') and (contains(.,'Halbschuhe') or contains(.,'Sneaker') or contains(.,'Ballerinas'))]]

私はあなたの表現をそのまま維持しようとしましたが、変更によって動作が変わることはありません。

XML 構造などについて仮定する必要があるさらに短い解決策がいくつかありますが、それらは、完全なコンテキストなしでは見ることができない隠れた方法で壊れている可能性があるため、その方法には行きません。

于 2013-02-08T12:49:06.363 に答える
2

XPath エンジンが XPath 2.0 をサポートしている場合は、さらに便利な (おそらく効率的な) 方法で実行できます。

//Product[
  CategoryPath/ProductCategoryPath[
    tokenize(., '\s') = ('Halbschuhe', 'Sneaker', 'Ballerinas') and contains(., 'Damen')
  ]
]

fn:tokenize($string, $token)正規表現で文字列を分割します (ここでは空白を使用していますが、スペースのみを指定することもできます)。=セットベースのセマンティクスで比較するため、左側の文字列のいずれかが右側の文字列のいずれかと等しい場合、true を返します。

于 2013-02-08T13:03:32.277 に答える