0

XSLT 2.0 で group-starting-with と group-by を組み合わせる必要があります

<xsl:for-each-group select="xxx[@attr='yyy']" group-by="@id" group-starting-with="xxx[@attr='yyy']">
...
</xsl:for-each-group>

そのような組み合わせを達成する方法は?

入力:

<root> 
        <library id="L1">
            <genre id="a">
                <shelf1 id="1">                
                    <book id="a1" action="borrow">
                        <attributes>
                            <user>John</user>                    
                        </attributes>
                        <other1>y</other1>
                    </book>  
                    <book id="a1" action="extend">
                        <attributes>
                            <user>Woo</user>           
                            <length>3</length>
                        </attributes>
                        <other2>y</other2>
                    </book> 
    </shelf1>
</genre>
    </library>
    </root>

出力:

<root> 
    <library id="L1">
        <genre id="a">
            <shelf1 id="1">                
                <book id="a1" action="borrow">
                    <attributes>
                        <user>Woo</user>           
                        <length>3</length>                   
                    </attributes>
                    <other1>y</other1>
                </book> 
</shelf1>
</genre>
</library>
</root>

私のXSLスニペット:

<xsl:template match="genre/*">
        <xsl:copy>
            <xsl:apply-templates select="@*" />

            <xsl:apply-templates select="
     book[@action='extend']                             
         [not( preceding-sibling::book[@action='borrow'])]" />


              <xsl:for-each-group
                select="book[@action='borrow'] 
             |   
            book[@action='extend']
                [preceding-sibling::book[@action='borrow']]"
                group-by="@id" group-starting-with="book[@action='borrow']"> (: "This is the one which needs to be combined :)
                    <xsl:for-each select="current-group()[1]">
                        <xsl:copy>   
                            <xsl:apply-templates select="@*" />
                            <xsl:call-template name="merge-books-deeply">    
                                <xsl:with-param name="books" select="current-group()" />
                                <xsl:with-param name="name-path" select="()" />
                            </xsl:call-template>
                        </xsl:copy>
                    </xsl:for-each>     
                </xsl:for-each-group>


            <xsl:apply-templates select="                             
     node()[ not( self::book[@action=('borrow','extend')])]" />

        </xsl:copy>
    </xsl:template>

@id同じを持つすべてのノードの後に​​ を持つ1 つ以上のノードがaction=borrow続くaction=extend

  • action=borrow でノードにマージします。
  • 属性の子をマージして、兄弟からのすべての一意の属性が最新の値を持つようにします。
  • 他の子は変更しないでください

ありがとう。ジョン

4

2 に答える 2

2

言語で提供される構造は group-by または group-starting-with のいずれかであるため、それらを組み合わせるように求めたときに何を期待するかは明確ではありません。

あなたができることは、for-each-group例えば入れ子です

<xsl:for-each-group select="xxx[@att = 'yyy']" group-by="@id">
  <xsl:for-each-group select="current-group()" group-starting-with="xxx[@attr = 'yyy']">...</xsl:for-each-group>
</xsl:for-each-group>

とはいえ、これを書きながら、グループ化集団xxx[@att = 'yyy']と pattern で始まるグループを持つことにどのような意味があるのだろうかと思いますxxx[@att = 'yyy']

したがって、入力がどのように表示され、どのようにグループ化するかをより詳細に説明する必要があると思います。

于 2012-07-18T16:29:11.890 に答える
0

私はこれがすべきだと思います:

<xsl:template match="root">
    <xsl:apply-templates select="library | genre"/>
    <xsl:apply-templates select="shelf1"/>
</xsl:template>

<xsl:template match="library | genre">
    <xsl:copy>
        <xsl:copy-of select="@*"/>

        <xsl:apply-templates select="library | genre | shelf1"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="shelf1">
    <xsl:copy>
        <xsl:copy-of select="@*"/>

        <xsl:for-each-group select="current()/book" group-by="@id">
            <book id="{current-grouping-key()}" action="borrow">
                <xsl:copy-of select="current-group()[@action='extend']/*"/>
            </book>
        </xsl:for-each-group>

    </xsl:copy>
</xsl:template>

于 2014-08-13T08:40:46.087 に答える