我需要在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
与action=borrow
相同的每个节点,后跟一个或多个节点action=extend
感谢。 约翰
答案 0 :(得分:2)
语言中提供的构造是一个分组还是分组 - 所以当你要求组合它们时,我们不清楚你期望什么。
你可以做的是嵌套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']
以及以模式xxx[@att = 'yyy']
开头的小组是什么意义。
因此,我认为您需要更详细地解释输入的外观以及您希望如何对其进行分组。
答案 1 :(得分: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>