我尝试为输入xml生成两种类型的序列号,其中包含重复的父元素和子元素。见下面的输入
我有一个输入xml,如:
<family>
<parent>P1<parent>
<child>C1<child>
</family>
<family>
<parent>P1<parent>
<child>C2<child>
</family>
<family>
<parent>P2<parent>
<child>C3<child>
</family>
<family>
<parent>P2<parent>
<child>C4<child>
</family>
<family>
<parent>P2<parent>
<child>C5<child>
</family>
我的预期输出是包含内容的文本文件:
00001 C1 00001
00001 C2 00002
00002 C3 00001
00002 C4 00002
00002 C5 00003
表示基于父级的第一个序列号,第二个基于子级。 我尝试使用
在我的xsl中<xsl:for-each-group select="family" group-by="child">
<xsl:value-of select="format-number(position(),'00000')"/>
<xsl:value-of select="child"/>
<xsl:value-of select="format-number(position(),'00000')"/>
</xsl:for-each-group>
对于上面的xsl我得到双方相同的序列号。是否有任何特定的功能或分组概念来实现,以便我可以实现所需的输出? 请帮助我完成这个逻辑。
答案 0 :(得分:1)
假设您的实际XML格式正确,则需要在此处使用两个xsl:for-each-group
元素。一个用于parent
分组,然后嵌套一个按child
分组当前组
<xsl:for-each-group select="family" group-by="parent">
<xsl:variable name="parentPos" select="format-number(position(),'00000')" />
<xsl:for-each-group select="current-group()" group-by="child">
<xsl:value-of select="$parentPos"/>
<xsl:text> </xsl:text>
<xsl:value-of select="child"/>
<xsl:text> </xsl:text>
<xsl:value-of select="format-number(position(),'00000')"/>
<xsl:text> </xsl:text>
</xsl:for-each-group>
</xsl:for-each-group>
答案 1 :(得分:1)
我根本不明白为什么你需要按孩子分组。每个孩子都不是唯一的吗?如果是这样,那就足够了:
<xsl:for-each-group select="family" group-by="parent">
<xsl:variable name="group-number" select="position()" />
<xsl:for-each select="current-group()/child">
<xsl:value-of select="format-number($group-number,'00000')"/>
<xsl:text> </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:value-of select="format-number(position(),'00000')"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:for-each-group>
注意:您的输入似乎已按parent
排序;在这种情况下,您可以使用:
<xsl:for-each-group select="family" group-adjacent="parent">