2014-12-23 82 views
0

我有一個平坦層次結構,其必須在層次式XML文檔中被轉換的XML文檔:XSLT 2.0:平XML任意層次化XML,如果屬性=屬性然後

在XML源文檔的第一示例:

<group id="xyz"> 
    <name>bla</name> 
    <part id="abc1"><name>blabla-1</name></part> 
    <part id="abc2"><name>blabla-2</name></part> 
    <part id="abc3"><name>blabla-3</name></part> 
    <part id="abc4"><name>blabla-4</name></part> 
    <part id="abc5"><name>blabla-5</name></part> 
    <part id="abc6"><name>blabla-6</name></part> 
    <part id="abc7"><name>blabla-7</name></part> 
    <part id="abc8"><name>blabla-8</name></part> 
</group> 
<group id="abc4"> 
    <name>blabla-4</name> 
    <part id="abc9"><name>blabla-9</name></part> 
    <part id="abc10"><name>blabla-10</name></part> 
    <part id="abc11"><name>blabla-11</name></part> 
    <part id="abc12"><name>blabla-12</name></part> 
    <part id="abc13"><name>blabla-13</name></part> 
    <part id="abc14"><name>blabla-14</name></part> 
    <part id="abc15"><name>blabla-15</name></part> 
    <part id="abc16"><name>blabla-16</name></part> 
</group> 
<group id="abc10"> 
    <name>blabla-10</name> 
    <part id="abc17"><name>blabla-17</name></part> 
    <part id="abc18"><name>blabla-18</name></part> 
    <part id="abc19"><name>blabla-19</name></part> 
    <part id="abc20"><name>blabla-20</name></part> 
    <part id="abc21"><name>blabla-21</name></part> 
    <part id="abc22"><name>blabla-22</name></part> 
    <part id="abc23"><name>blabla-23</name></part> 
    <part id="abc24"><name>blabla-24</name></part> 
</group> 

下面是一個例子targed XML文檔應該如何看起來像:

<group id="xyz"> 
    <name>bla</name> 
    <part id="abc1"><name>blabla-1</name></part> 
    <part id="abc2"><name>blabla-2</name></part> 
    <part id="abc3"><name>blabla-3</name></part> 
    <group id=abc4"> 
     <name>blabla-4</name> 
     <part id="abc9"><name>blabla-9</name></part> 
     <group id="abc10"> 
     <name>blabla-10</name> 
      <part id="abc17"><name>blabla-17</name></part> 
      <part id="abc18"><name>blabla-18</name></part> 
      <part id="abc19"><name>blabla-19</name></part> 
      <part id="abc20"><name>blabla-20</name></part> 
      <part id="abc21"><name>blabla-21</name></part> 
      <part id="abc22"><name>blabla-22</name></part> 
      <part id="abc23"><name>blabla-23</name></part> 
      <part id="abc24"><name>blabla-24</name></part> 
     </group> 
     <part id="abc11"><name>blabla-11</name></part> 
     <part id="abc12"><name>blabla-12</name></part> 
     <part id="abc13"><name>blabla-13</name></part> 
     <part id="abc14"><name>blabla-14</name></part> 
     <part id="abc15"><name>blabla-15</name></part> 
     <part id="abc16"><name>blabla-16</name></part> 
    </group> 
</group> 
+0

爲什麼是'part'元件ID爲'abc5','abc6'等不是在結果'group id =「xyz」'的輸出?一旦找到引用「組」的「零件」(如'abc4'),您是否想要停止處理'part'元素? –

+0

您的第一個問題是您的「XML源文檔」不是XML文檔,因爲它缺少一個根級元素。 –

+0

Martin Honnen:不,我忘了在示例中添加abc5-abc8(我對此感到羞恥!)它不應該停止那裏的過程......而對於Ian Roberts:對於這個例子,我忽略了根文件,真正的文檔有一個根元素,所以再次,我的錯誤-_-感謝迄今爲止的答案! – gecko

回答

1

如果你簡單地處理任何引用組,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:mf="http://example.com/mf" 
    exclude-result-prefixes="xs mf" 
    version="2.0"> 

<xsl:param name="start-id" as="xs:string" select="'xyz'"/> 

<xsl:output indent="yes"/> 

<xsl:key name="gid" match="group" use="@id"/> 

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

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:apply-templates select="key('gid', $start-id)"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="part[key('gid', @id)]"> 
    <xsl:apply-templates select="key('gid', @id)"/> 
</xsl:template> 

</xsl:stylesheet> 

那麼對於輸入

<groups> 
<group id="xyz"> 
    <name>bla</name> 
    <part id="abc1"><name>blabla-1</name></part> 
    <part id="abc2"><name>blabla-2</name></part> 
    <part id="abc3"><name>blabla-3</name></part> 
    <part id="abc4"><name>blabla-4</name></part> 
    <part id="abc5"><name>blabla-5</name></part> 
    <part id="abc6"><name>blabla-6</name></part> 
    <part id="abc7"><name>blabla-7</name></part> 
    <part id="abc8"><name>blabla-8</name></part> 
</group> 
<group id="abc4"> 
    <name>blabla-4</name> 
    <part id="abc9"><name>blabla-9</name></part> 
    <part id="abc10"><name>blabla-10</name></part> 
    <part id="abc11"><name>blabla-11</name></part> 
    <part id="abc12"><name>blabla-12</name></part> 
    <part id="abc13"><name>blabla-13</name></part> 
    <part id="abc14"><name>blabla-14</name></part> 
    <part id="abc15"><name>blabla-15</name></part> 
    <part id="abc16"><name>blabla-16</name></part> 
</group> 
<group id="abc10"> 
    <name>blabla-10</name> 
    <part id="abc17"><name>blabla-17</name></part> 
    <part id="abc18"><name>blabla-18</name></part> 
    <part id="abc19"><name>blabla-19</name></part> 
    <part id="abc20"><name>blabla-20</name></part> 
    <part id="abc21"><name>blabla-21</name></part> 
    <part id="abc22"><name>blabla-22</name></part> 
    <part id="abc23"><name>blabla-23</name></part> 
    <part id="abc24"><name>blabla-24</name></part> 
</group> 
</groups> 

結果是

<groups> 
    <group id="xyz"> 
     <name>bla</name> 
     <part id="abc1"> 
     <name>blabla-1</name> 
     </part> 
     <part id="abc2"> 
     <name>blabla-2</name> 
     </part> 
     <part id="abc3"> 
     <name>blabla-3</name> 
     </part> 
     <group id="abc4"> 
     <name>blabla-4</name> 
     <part id="abc9"> 
      <name>blabla-9</name> 
     </part> 
     <group id="abc10"> 
      <name>blabla-10</name> 
      <part id="abc17"> 
       <name>blabla-17</name> 
      </part> 
      <part id="abc18"> 
       <name>blabla-18</name> 
      </part> 
      <part id="abc19"> 
       <name>blabla-19</name> 
      </part> 
      <part id="abc20"> 
       <name>blabla-20</name> 
      </part> 
      <part id="abc21"> 
       <name>blabla-21</name> 
      </part> 
      <part id="abc22"> 
       <name>blabla-22</name> 
      </part> 
      <part id="abc23"> 
       <name>blabla-23</name> 
      </part> 
      <part id="abc24"> 
       <name>blabla-24</name> 
      </part> 
     </group> 
     <part id="abc11"> 
      <name>blabla-11</name> 
     </part> 
     <part id="abc12"> 
      <name>blabla-12</name> 
     </part> 
     <part id="abc13"> 
      <name>blabla-13</name> 
     </part> 
     <part id="abc14"> 
      <name>blabla-14</name> 
     </part> 
     <part id="abc15"> 
      <name>blabla-15</name> 
     </part> 
     <part id="abc16"> 
      <name>blabla-16</name> 
     </part> 
     </group> 
     <part id="abc5"> 
     <name>blabla-5</name> 
     </part> 
     <part id="abc6"> 
     <name>blabla-6</name> 
     </part> 
     <part id="abc7"> 
     <name>blabla-7</name> 
     </part> 
     <part id="abc8"> 
     <name>blabla-8</name> 
     </part> 
    </group> 
</groups> 
+0

如果你沒有一個特定的組ID,你可以通過定義第二個鍵'然後進行初始化'apply-templates select =「group [not(key('pid',@id))]'' –

+0

@ IanRoberts,我同意你的建議,但會等到海報評論整個方法是否滿足要求。 –

+0

謝謝你們的答案。我會盡快嘗試並提供一些反饋。首先我會嘗試追溯Martin Honnen的劇本 - 這實際上是結果應該是什麼樣子。伊恩羅伯茨的暗示很好。由於它是零件清單,因此總是會有一個特定ID的組,其中包含所有下列組和零件。但我會記住第二個關鍵建議並嘗試 - 但首先是建議的腳本,非常感謝Martin Honnen! – gecko