2015-06-22 51 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