我有一个看起来像这样的xml:
<texto id="1">
<user_id>1</user_id>
...
</texto>
<texto id="2">
<user_id>1</user_id>
...
</texto>
<texto id="3">
<user_id>2</user_id>
...
</texto>
我想把它变成这样:
<user id="1">
<texto id="1">...</texto>
<texto id="2">...</texto>
</user>
<user id="2">
<texto id="3">...</texto>
</user>
我尝试以下xsl:
<xsl:template match="/">
<xsl:variable name="user_ids" select="distinct-values(//document/texto/user_id)"/>
<xsl:for-each select="$user_ids">
<xsl:variable name="user_id" select="."/>
<xsl:variable name="textos" select="//document/texto[user_id = $user_id]"/>
<user id="$user_id">
</user>
</xsl:for-each>
</xsl:template>
但此时我得到一个错误:前导'/'无法选择包含上下文项的树的根节点:上下文项不是节点
如何通过其不同的用户子节点对所有texto节点进行分组?
谢谢
答案 0 :(得分:1)
使用
<xsl:for-each-group select="//texto" group-by="user_id">
<user id="{current-grouping-key()}">
<xsl:apply-templates select="current-group()"/>
</user>
</xsl:for-each-group>
然后为texto元素编写模板
<xsl:template match="texto">
<xsl:copy>
<xsl:copy-of select="@*, node() except user_id"/>
</xsl:copy>
</xsl:template>