SQLServerからデータをXMLとしてクエリすると、重複するXMLノードが生成されることがよくあります。多くの場合、クエリを微調整してこれを排除できますが、常にそうとは限りません。できないときは、次のようなXMLになります。
<Xml>
<House houseId="3" address="123 Main">
<Dog dogId="13" name="Rover">
<Flea fleaId="17" name="Chester" />
</Dog>
<Dog dogId="13" name="Rover">
<Flea fleaId="23" name="Poindexter" />
</Dog>
</House>
<House houseId="3" address="123 Main">
<Human humanId="9" name="Mr. Johnson">
<Child childId="11" name="Susie" />
</Human>
<Human humanId="9" name="Mr. Johnson">
<Child childId="31" name="Sandy" />
</Human>
</House>
<House houseId="5" address="987 Wall">
<Dog dogId="13" name="Rover">
<Flea fleaId="17" name="Chester" />
</Dog>
<Dog dogId="13" name="Rover">
<Flea fleaId="19" name="Wilhelm" />
</Dog>
</House>
</Xml>
属性が同じである2つの<House>ノードが隣り合っていることに注意してください。それらは子ノードのみが異なります。同一の兄弟ノードを取得し、それらをすべての子ノードのスーパーセットを含むものに折りたたむXSLTを作成しようとしています。この例では、<House houseId = "3">には、<Dog>ノードと<Human>ノードの両方が含まれます。このような:
<Xml>
<House houseId="3" address="123 Main">
<Dog dogId="13" name="Rover">
<Flea fleaId="17" name="Chester" />
<Flea fleaId="23" name="Poindexter" />
</Dog>
<Human humanId="9" name="Mr. Johnson">
<Child childId="11" name="Susie" />
<Child childId="31" name="Sandy" />
</Human>
</House>
<House houseId="5" address="987 Wall">
<Dog dogId="13" name="Rover">
<Flea fleaId="17" name="Chester" />
<Flea fleaId="19" name="Wilhelm" />
</Dog>
</House>
</Xml>
2つの同一のHouseノードが結合されただけでなく、重複したDogノードとHumanノードが結合されました。ただし、2つの異なる<House>ノードの下にリストされている<Dog dogId = '13' name ='Rover'>ノードは、同一ではないため、結合されていないことに注意してください。(彼らの祖先のために。)それが私が目指していることです:一致する兄弟ノードを組み合わせます。
XMLはSQLによって生成されるため、XSLTはさまざまな名前と配置のノードを処理します。したがって、ノード名をハードコーディングすることはできません。ただし、すべてのノードには、数値を含む対応するid属性があります。例:<House houseId = "3">、<Dog dogId = "17">、および<Flea fleaId="13">。
また、ルートノードには属性がないこともわかっているので、ルートの子であるノードの処理を開始できます。
私の戦略は、ノードごとにxsl:keyを作成することです。ここで、ノードのkey-valueは、その祖先ノードとid値の連結です。キー値の例は以下のコメントにあります
<Xml>
<House houseId="3" address="123 Main"><!--"houseId=3"-->
<Dog dogId="13" name="Rover" ><!--"houseId=3;dogId=13"-->
<Flea fleaId="17" name="Chester" /><!--"houseId=3;dogId=13;fleaId=17"-->
</Dog>
<Dog dogId="13" name="Rover" ><!--"houseId=3;dogId=13"-->
<Flea fleaId="23" name="Poindexter" /><!--"houseId=3;dogId=13;fleaId=23"-->
</Dog>
</House>
<House houseId="3" address="123 Main" ><!--"houseId=3"-->
<Human humanId="9" name="Mr. Johnson" ><!--"houseId=3;humanId=9"-->
<Child childId="11" name="Susie" /><!--"houseId=3;humanId=9;childId=11"-->
</Human>
<Human humanId="9" name="Mr. Johnson"><!--"houseId=3;humanId=9"-->
<Child childId="31" name="Sandy" /><!--"houseId=3;humanId=9;childId=31"-->
</Human>
</House>
<House houseId="5" address="987 Wall" ><!--"houseId=5"-->
<Dog dogId="13" name="Rover"><!--"houseId=5;dogId=13"-->
<Flea fleaId="17" name="Chester" /><!--"houseId=5;dogId=13;fleaId=17"-->
</Dog>
<Dog dogId="13" name="Rover"><!--"houseId=5;dogId=13"-->
<Flea fleaId="19" name="Wilhelm" /><!--"houseId=5;dogId=13;fleaId=19"-->
</Dog>
</House>
</Xml>
したがって、<Dog dogId = '13' name ='Rover'>の2つの一見一致するオカレンスは、それらの祖先によって区別されます。
<Xml> <House houseId = "3"> <Dog dogId = '13' name ='Rover'>
houseId = 3; dogId = 13
対。
<Xml> <House houseId = "5"> <Dog dogId = '13' name ='Rover'>
houseId = 5; dogId = 13
これにより、重複(兄弟)ノードを組み合わせることができます。残念ながら、XSLとxslt:keyを使用してこれを実装する方法を理解するのに苦労しています。どんな助けでも大歓迎です。