在XSLT中为父子元素生成序列号

时间:2015-06-22 07:39:56

标签: xml xslt

我尝试为输入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我得到双方相同的序列号。是否有任何特定的功能或分组概念来实现,以便我可以实现所需的输出? 请帮助我完成这个逻辑。

2 个答案:

答案 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>&#10;</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>&#10;</xsl:text>          
    </xsl:for-each>
</xsl:for-each-group> 

注意:您的输入似乎已按parent排序;在这种情况下,您可以使用:

<xsl:for-each-group select="family" group-adjacent="parent">