2017-11-15 14 views
1

特定のサブ要素を持つ重複グループ(Muenchianグループで行われたグループ)から1つの要素を選択できるようにしたいと考えています。私のXMLは次のようになります。XSLT/Muenchian grouping:グループから特定のサブ要素を持つ要素を選択する方法は?

<waybill> 
<shipment> 
    <parcel> 
     <sscc>SSCC1</sscc> 
     <consignee>Receiver1</consignee> 
    </parcel> 
    <parcel> 
     <sscc>SSCC2</sscc> 
     <consignee>Receiver2</consignee> 
     <attention>Note2</attention> 
    </parcel> 
    <parcel> 
     <sscc>SSCC3</sscc> 
     <consignee>Receiver3</consignee> 
    </parcel> 
    <parcel> 
     <sscc>SSCC4</sscc> 
     <consignee>Receiver4</consignee> 
    </parcel> 
    <parcel> 
     <sscc>SSCC1</sscc> 
     <consignee>Receiver1</consignee> 
     <attention>Note1</attention> 
    </parcel> 
    <parcel> 
     <sscc>SSCC3</sscc> 
     <consignee>Receiver3</consignee> 
     <attention>Note3</attention> 
    </parcel> 
</shipment> 
</waybill> 

と私のXSLTは、次のようになります。出力は次のようになります

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0"> 
<xsl:output method="text" version="1.0" encoding="ISO-8859-1" indent="yes"/> 
<xsl:key name="ean" match="parcel" use="sscc"/> 
<xsl:template match="/"> 
    <xsl:for-each select="/waybill/shipment/parcel[generate-id()=generate-id(key('ean',sscc))]"> 
     <xsl:value-of select="current()/sscc"/> 
     <xsl:text>§</xsl:text> 
     <xsl:value-of select="current()/consignee"/> 
     <xsl:text>§</xsl:text> 
     <xsl:value-of select="current()/attention"/> 
     <xsl:text>&#xd;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

SSCC1§Receiver1§ 
SSCC2§Receiver2§Note2 
SSCC3§Receiver3§ 
SSCC4§Receiver4§ 

ので、私のXSLTは今、最初のヒットを選択しますグループ化された要素から、結果として私が望むものは次のとおりです。

SSCC1§Receiver1§Note1 
SSCC2§Receiver2§Note2 
SSCC3§Receiver3§Note3 
SSCC4§Receiver4§ 

したがって、XSLTはグループからの重複を最も多く持つデータを見つける必要があります。最初または最後ではなく、特定のサブ要素を持つもの(または最終的なケースではサブサブ要素)

この場合、すべての要素にサブ要素(ここではSSCC4)が含まれているわけではなく、彼らが持っているデータと一緒に使うべきです(無視すべきではありません)。

グループ化された同様の要素から「最高の」要素を見つける正しい方法は何ですか?

すべてのヘルプは高く評価される:)

答えて

1

あなたはこのように、key()から移動できます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="2.0"> 
    <xsl:output method="text" version="1.0" encoding="ISO-8859-1" indent="yes"/> 
    <xsl:key name="ean" match="parcel" use="sscc"/> 

    <xsl:template match="/"> 
     <xsl:for-each select="/waybill/shipment/parcel[generate-id()=generate-id(key('ean',sscc))]"> 
      <xsl:variable name="group" select="key('ean',sscc)" /> 
      <xsl:value-of select="sscc"/> 
      <xsl:text>§</xsl:text> 
      <xsl:value-of select="key('ean',sscc)/consignee"/> 
      <xsl:text>§</xsl:text> 
      <xsl:value-of select="key('ean',sscc)/attention"/> 
      <xsl:text>&#xd;</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

key('ean',sscc)現在のグループのすべての<parcel>要素とその下key('ean',sscc)/attentionすべて<attention>の要素を選択することになります。

XSLT 2.0以降では、同じ効果のために<xsl:for-each-group>current-group()関数を使用することもできます。

<xsl:value-of>の中でkey('ean',sscc)/attentionを使用すると、最初の一致の値だけが表示されますが、それはとにかく意図しているようです。

current()のように明示的に使用することは、実際には必要ありません。 current()は、通常のselect式でXPath述語の内部で使用されることを意図しています。

関連する問題