2013-12-19 47 views
2

這是第一次海報,所以請不要猶豫,讓我知道如果我做錯了什麼。如何使用XPath選擇非空同胞節點的Cartesian產品集?

我正在使用Altova Stylevision打印表單文檔,並且需要爲每個唯一的兩個節點集合打印一份表單副本。下面是一個示例XML來更好地解釋我所要求的。

<form> 
    <Animals> 
     <Animal> 
      <AName>Boomer</AName> 
      <AAddress>House</AAddress> 
     </Animal> 
     <Animal> 
      <AName>Growl</AName> 
      <AAddress>Street</AAddress> 
     </Animal> 
     <Animal> 
      <AName>Incognito</AName> 
      <AAddress>Nowhere</AAddress> 
     </Animal> 
    </Animals> 
    <People> 
     <Person> 
      <PName>Willy</PName> 
      <PAddress>123 Common Lane</PAddress> 
     </Person> 
     <Person> 
      <PName>Wonka</PName> 
      <PAddress>Chocolate Factory</PAddress> 
     </Person> 
    </People> 
</form> 

我想從上述樣品6個產生唯一值(乘積),包含的<Animal><Person>其中他們都不是空的每個組合。因此,輸出這個例子將會像(只顯示分組,需要所有的子節點,而不是僅僅名稱):

([Boomer, Willy], [Boomer, Wonka], [Growl, Willy], [Growl, Wonka], [Incognito, Willy], [Incognito, Wonka]) 

編輯:我試圖讓節點,而不僅僅是<Name>元素值。因爲我在此模板中包裝整個StyleVision表單,所以範圍應該在<Animal><Person>級別。這樣,在表單中,我可以只說/AName, /PName,,並在表單的每個副本上獲得/AName/PName的一個值。它應該作爲元素節點的6個實例,每個代表<Person><Animal>的唯一組合。

我看着for # in # return語法,但我不知道如何返回唯一集。下面是我到目前爲止已經試過:

for $a in form/Animals/Animal, $p in form/People/Person return ($a, $p) 

form/Animals/Animal | form/People/Person 

任何人都可以點我在正確的方向?

謝謝!

回答

1

更新

for表達是正確的,你只需要添加的元素構造得到你需要的結果:

for $animal in $x/Animals/Animal, 
    $person in $x/People/Person 
return element union { $animal, $person } 

元素名稱(union在本例中)可任何你想要的。


這些原始代碼示例將從問題生成結果字符串。

這是一個有點難以閱讀,但是這會做你想要什麼:

concat("(", 
    concat(string-join(
    for $animal in /form/Animals/Animal/Name, 
     $person in /form/People/Person/Name 
    return concat("[", concat(string-join(($animal, $person), ", "), "]")), ", "), ")")) 

如果可以使用XPath/XQuery的3.0處理器,你可以用它代替了concat功能||連接符電話,這是(有點)更具可讀性:

"(" || 
    string-join(
    for $animal in /form/Animals/Animal/Name, 
     $person in /form/People/Person/Name 
    return "[" || string-join(($animal, $person), ", ") || "]" 
    , ", ") 
|| ")" 
+0

感謝您的回答。我現在意識到,我的問題形成的不是很好,我沒有詳細說明我在找什麼。而不是僅僅是字符串值,我想要整個節點。我只記得它叫做笛卡兒積**,我希望節點的產品代表一個整體產品集。 – semaj1919

+0

你想要一個序列中現有的動物和人物元素,還是你想要一個動物和人物的每一個新元素的聯合? – joemfb

+0

後者,一個動物和一個人的一個新元素的內部結合。非常感謝您的幫助! – semaj1919