2016-03-22 59 views
0

相關的項目,我有以下XML輸入,進行相關使用XSLT

<Adult> 
    <Parent> 
     <Id>1</Id> 
     <Name>Nick</Name> 
     <Age>32</Age> 
    </Parent> 
    <Parent> 
     <Id>2</Id> 
     <Name>Michael</Name> 
     <Age>35</Age> 
    </Parent> 
    <Information xmlns="http://ws.apache.org/ns/synapse" xmlns:ns="www.abc.com"> 
     <Children xmlns=""> 
      <Child> 
       <Name>Anne</Name> 
       <Gender>Female</Gender> 
       <ParentId>1</ParentId> 
      </Child> 
      <Child> 
       <Name>Will</Name> 
       <Gender>Male</Gender> 
       <ParentId>1</ParentId> 
      </Child> 
      <Child> 
       <Name>Carney</Name> 
       <Gender>Female</Gender> 
       <ParentId>2</ParentId> 
      </Child> 
     </Children> 
    </Information> 
</Adult> 

目前,我有所有根元素下的孩子。但我需要將每個孩子與其關聯的父母進行分組。舉一個例子,parentId = 1的所有孩子都應該在Id-1的父元素之下。最後它應該如下所示。

<Adult> 
    <Parent> 
     <Id>1</Id> 
     <Name>Nick</Name> 
     <Age>32</Age> 
     <Children> 
      <Child> 
       <Name>Anne</Name> 
       <Gender>Female</Gender> 
       <ParentId>1</ParentId> 
      </Child> 
      <Child> 
       <Name>Will</Name> 
       <Gender>Male</Gender> 
       <PareinId>1</PareinId> 
      </Child> 
     </Children> 
    </Parent> 
    <Parent> 
     <Id>2</Id> 
     <Name>Michael</Name> 
     <Age>35</Age> 
     <Children> 
      <Child> 
       <Name>Carney</Name> 
       <Gender>Female</Gender> 
       <ParentId>2</ParentId> 
      </Child> 
     </Children> 
    </Parent> 
</Adult> 

有人可以建議我一種方法來完成這件事。任何幫助,將不勝感激。

回答

1

XSLT有一個內置的key機制,解決交叉引用:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:syn="http://ws.apache.org/ns/synapse" 
exclude-result-prefixes="syn"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="child" match="Child" use="ParentId" /> 

<xsl:template match="@*|node()"> 
    <xsl:copy copy-namespaces="no"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Parent"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
     <Children> 
      <xsl:apply-templates select="key('child', Id)"/> 
     </Children> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="syn:Information"/> 

</xsl:stylesheet> 
+0

非常感謝的快速反應。您的解決方案在一定程度上起作用。但對於Id = 1的父母,我只有一個孩子的孩子有兩個孩子。任何想法呢? :) –

+0

第二個孩子有'PareinId'而不是'ParentId'。我認爲這是一個錯字。 –

+0

不便之處,敬請原諒。這是我的錯誤,你的解決方案完美無缺。非常感謝,我會在這裏糾正錯誤。 :) –