2015-06-22 55 views
0

我试图为我的输入xml重复地包含父元素和子元素生成两种类型的序列号。请参阅下面的输入在XSLT中为父子元素生成序列号

我有一个输入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我越来越对双方相同的序列号。是否有任何特定的功能或分组概念来实现,以便我可以实现所需的输出? 请帮我理解这个逻辑。

回答

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> 
+0

谢谢,它工作完美! – Jarvis

+0

蒂姆,我有一个小的疑问,我如何提取所有父节点的最后一个孩子?例如:C2,C5 – Jarvis

+0

你可以在外部的for-each-group循环中做'current-group()[last()]'。如果你无法使用它,请随时在SO上提出一个全新的问题。谢谢! –

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"> 
+0

是的,你是对的,只有小孩才是一个错误。但感谢“群邻”。 – Jarvis