2017-10-12 4 views
0

私は、マルチパスフィールドに5つ以上の値を持つアイテムの数であるSitecoreのXPATH Builderを数えようとしています。Sitecore item multilistfield XPATH builder

"|"の数はカウントできません。生の値から、私は固執していると言うことができます。

すべての情報が役立ちます。

ありがとうございます。

答えて

1

私がサイトコアでXPathを使用するので、長い時間をされている - ので、私は重要な何かを忘れてしまったことがあります - しかし:

悲しいことに、私はこれが可能だとは思いません。 XPath Builderは実際には適切なXPathを実行しません。これは、完全なXPathパーサーで正しく評価されるもののサブセットを理解しています。

私が手にしなければならないv8初期リリースのインスタンスではできないことの1つは、Sitecoreアイテムではないものを返すXPathを処理できることです。 、あなたは、このようなクエリを実行することができれば

Failed query

:しかし、あなたはサイトコアクエリ構文、またはXPath構文のオプションのいずれかを使用していることを実行しようとすると、エラーが出る - count(/sitecore/content/*)のようなクエリでは、数値を返す必要がありますその後、あなたの答えは、特定のフィールドが参照するGUIDの数を実行するために、このような式に基づいて次のようになります。私は、テストを実行することはできませんよう

string-length(translate(/yourNodePath/@yourFieldName, "abcdefg1234567890{}-", "")) + 1 

は(、メモリから型指定された - ので、完全ではないかもしれません正しい)

translate()関数は、最初の文字列内の任意の文字を2番目の文字列内の関連する文字に置き換えます。したがって、(私が正しく入力した場合)その式はすべてのGUIDを削除し、パイプ区切り文字をそのまま残してください。したがって、残りの文字列の長さに加えて、処理する必要がある各Itemの答えが1つです。

しかし、私が言うように、私はあなたが実際にクエリビルダからのことを実行することができるとは思わない...

最近では、人々はこのようなアドホッククエリを記述するためにSitecore PowerShell Extensionsを使用する傾向があります。はるかに柔軟で強力です。もしあなたがそれを使うことができれば、私はそれをお勧めします。


編集を追加する:をこの質問は私の頭の中で立ち往生ビットを得た - ので、あなたはPowerShellを使用することができれば、ここにあなたがそれを行う可能性があります方法は次のとおりです。あなたがどこに」宣言したと仮定すると、

検索再、あなたは何MultiListフィールドを照会していて、選択項目のどの数が超えなければならない:

$root = "/sitecore/content/Root" 
$field = "MultiListField" 
$targetNumber = 3 

をし、「読みやすい」のコードは次のようになります。

foreach($item in Get-ChildItem $root) 
{ 
    $currentField = Get-ItemField $item -ReturnType Field -Name $field 
    if($currentField) 
    { 
     $count = $currentField.Value.Split('|').Count 
     if($count -gt $targetNumber) 
     { 
      $item.Paths.Path 
     } 
    } 
} 

指定したルート項目の子を反復し、フィールドの内容を取得します。そのフィールド名に値がある場合は、そのフィールド名をGUIDに分割してカウントします。そのカウントの結果がしきい値より大きい場合は、アイテムのURIを返します。

あなたは次のようになります(難しい読み出すために)ワンライナーの外に同じ答えを得ることができ

Get-ChildItem $root | Select-Object Paths, @{ Name="FieldCount"; Expression={ Get-ItemField $_ -ReturnType Field -Name $field | % { $_.Value.Split('|').Count } } } | Where-Object { $_.FieldCount -gt $targetNumber } | % { $_.Paths.Path } 

(それはそれを書くための最良の方法だかどうかわからない - 私はよPowerShell構文の専門家はいませんが、私が見る限り同じ結果が得られます)

関連する問題