2012-08-13 49 views
0

我正在使用XSLT 1.0,我正在尋求將例如相關人員的xml文檔劃分爲家庭。家庭是單親家庭及其子女的定義。XSLT - 羣組家庭在一起

所以這個:

<person name =」A」> 
    <person name =」B」> 
     <person name =」D」 /> 
     <person name =」E」 /> 
    </person> 
    <person name=」C」> 
     <person name =」F」 /> 
     <person name =」G」 /> 
     <person name =」H」 /> 
    </person> 
</person> 

會導致:

<family id =」1」> 
    <person name =」A」> 
     <person name =」B」/> 
     <person name=」C」/> 
    </person> 
</family> 

<family id =」2」> 
    <person name =」B」> 
     <person name =」D」 /> 
     <person name =」E」 /> 
    </person> 
</family> 


<family id =」3」> 
    <person name=」C」> 
     <person name =」F」/> 
     <person name =」G」/> 
     <person name =」H」/> 
    </person> 
</family> 

我怎樣才能做到這一點以簡單的方式?

+0

你需要爲每個「家庭」的單獨的XML文檔或將輸出只是一個包含所有系列的XML文檔(在這種情況下,您將需要輸出XML的根元素)? – 2012-08-13 07:42:24

+0

不需要單獨的文檔。所以我想我需要一個根。 – goofy 2012-08-13 07:54:49

回答

0

的一種方法是首先尋找所有人有其他子元素元素

<xsl:apply-templates select="//person[person]"/> 

然後,對於每個這樣的元素,你會複製元素,其眼前的孩子只有

<xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates select="person" mode="child"/> 
</xsl:copy> 

同時,爲了家庭的id,你可以指望前面的所有種人元素,和祖先

<family id="{count(preceding::person[person]) + count(ancestor-or-self::person)}"> 

「子」模板將剛纔複製的及其屬性,但沒有孩子。

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <families> 
      <xsl:apply-templates select="//person[person]"/> 
     </families> 
    </xsl:template> 

    <xsl:template match="person[person]"> 
     <family id="{count(preceding::person[person]) + count(ancestor-or-self::person)}"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates select="person" mode="child"/> 
     </xsl:copy> 
     </family> 
    </xsl:template> 

    <xsl:template match="person" mode="child"> 
     <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

當適用於您的示例XML,下面是輸出

<families> 
    <family id="1"> 
     <person name="A"> 
     <person>B</person> 
     <person>C</person> 
     </person> 
    </family> 
    <family id="2"> 
     <person name="B"> 
     <person>D</person> 
     <person>E</person> 
     </person> 
    </family> 
    <family id="3"> 
     <person name="C"> 
     <person>F</person> 
     <person>G</person> 
     <person>H</person> 
     </person> 
    </family> 
</families> 
+0

如何將其更改爲將個人標籤中的內容保存爲屬性?因爲他們不止一個名字。例如: 這將輸出: AL 我可以每次複製每個屬性嗎? – goofy 2012-08-13 08:36:20

+0

我已更正了XSLT中的錯誤,因此它現在應該正確地複製屬性。 – 2012-08-13 08:41:19

+0

我現在唯一的問題是人標籤可以是不同的類型,比如。但是他們在家庭中應該得到同樣的對待。我很難搞清楚如何讓這個工作。 – goofy 2012-08-13 10:05:36