2012-09-20 191 views
1

假設我們有以下的XML的通用處理...XML元素的兒童

<FruitBasket> 
    <Basket> 
     <Apple>1</Apple> 
     <Banana>2</Banana> 
     <Orange>3</Orange> 
    </Basket> 
    <Basket> 
     <Avocado>1</Avocado> 
     <Lemon>2</Lemon> 
    </Basket> 
</FruitBasket> 

使用XSLT我如何會生成以下的轉型?

<BasketContents> 
    <Content> 
     <FruitName>Apple</FruitName> 
     <FruitAmount>1</FruitAmount> 
     <FruitName>Banana</FruitName> 
     <FruitAmount>2</FruitAmount> 
     <FruitName>Orange</FruitName> 
     <FruitAmount>3</FruitAmount> 
    </Content> 
    <Content> 
     <FruitName>Avocado</FruitName> 
     <FruitAmount>1</FruitAmount> 
     <FruitName>Lemon</FruitName> 
     <FruitAmount>2</FruitAmount> 
    </Content> 
</BasketContents> 

我就必須這樣做一般,不知道是什麼類型的水果的籃子中的XSLT將不得不處理的「菜籃子」的任何子元素。例如,我不知道籃子裏是否有蘋果或鱷梨,也不知道籃子裏有多少種水果。

基本上,這需要知道如何調用子元素的名稱,所以從XML的<Basket>元素中,我可能會應用模板來獲取其未知子元素的名稱。

對不起,如果比喻比有幫助更混亂。

回答

2

果果的名字不重複(或者如果重複水果名稱是產生兩個FruitNameFruitAmount雙),那麼這樣的事情應該做你需要的東西:

<xsl:template match="/FruitBasket"> 
    <BasketContents> 
    <xsl:apply-templates/> 
    </BasketContents> 
</xsl:template> 

<xsl:template match="Basket"> 
    <Content> 
    <xsl:apply-templates/> 
    </Content> 
</xsl:template> 

<xsl:template match="Basket/*"> 
    <FruitName> 
    <xsl:value-of select="name()"/> 
    </FruitName> 
    <FruitAmount> 
    <xsl:value-of select="."/> 
    </FruitAmount> 
</xsl:template> 

如果需要檢測給定水果的多次出現並對其內容進行求和,然後您將希望閱讀關於XSLT的良好參考源中的分組。在XSLT 1.0中,要在索引中查找的關鍵字是「Muenchian分組」。在XSLT 2.0中,分組更簡單(有分組構造)。

+0

謝謝你。我相信這應該很好。 –