2014-12-04 37 views
0

我正在爲解決以下問題而苦苦掙扎,希望有人能指引我朝着正確的方向前進。使用XSLT解析

爲了說明這個問題,我會嘗試將其與最簡單的形式配對。我有以下數據:

<?xml version="1.0" encoding="UTF-8"?> 
<SampleData> 
    <Data>AA-BRAND1,BB-BRAND1,AA-BRAND2</Data> 
</SampleData> 

,需要產生以下的輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<ListOfBrandSales> 
    <BrandSales> 
     <BrandChannel>AA</BrandChannel> 
     <ListOfBrand> 
      <Brand>BRAND1</Brand> 
      <Brand>BRAND2</Brand> 
     </ListOfBrand> 
    </BrandSales> 
    <BrandSales> 
     <BrandChannel>BB</BrandChannel> 
      <Brand>BRAND1</Brand> 
    </BrandSales> 
</ListOfBrandSales> 

我一直在玩的記號化和不同值的功能,但我無法得到它。似乎我需要嵌套這些功能,並不確定是否可能。我很抱歉,如果解決方案很明顯,但我對XSLT有點新意。

在此先感謝。

+0

你可以使用XSLT 2.0嗎? – 2014-12-04 17:03:07

+0

是的,我可以。謝謝 – user3570518 2014-12-04 17:29:02

回答

0

如何:

XSLT 2.0

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

<xsl:variable name="tokens" select="tokenize(/SampleData/Data, ',')" /> 

<xsl:variable name="channels"> 
    <xsl:for-each select="$tokens"> 
     <channel><xsl:value-of select="substring-before(., '-')"/></channel> 
    </xsl:for-each> 
</xsl:variable> 

<xsl:template match="/"> 
    <ListOfBrandSales> 
     <xsl:for-each select="distinct-values($channels/channel)"> 
      <BrandSales> 
       <BrandChannel><xsl:value-of select="."/></BrandChannel> 
        <ListOfBrand> 
         <xsl:for-each select="$tokens[starts-with(., current())]"> 
          <Brand><xsl:value-of select="substring-after(., '-')"/></Brand> 
         </xsl:for-each> 
       </ListOfBrand> 
      </BrandSales> 
     </xsl:for-each> 
    </ListOfBrandSales> 
</xsl:template> 

</xsl:stylesheet> 

或者,如果你喜歡:

XSLT 2.0

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

<xsl:template match="/"> 
    <ListOfBrandSales> 
     <xsl:for-each-group select="tokenize(SampleData/Data, ',')" group-by="substring-before(., '-')"> 
      <BrandSales> 
       <BrandChannel><xsl:value-of select="current-grouping-key()"/></BrandChannel> 
        <ListOfBrand> 
         <xsl:for-each select="current-group()"> 
          <Brand><xsl:value-of select="substring-after(., '-')"/></Brand> 
         </xsl:for-each> 
       </ListOfBrand> 
      </BrandSales> 
     </xsl:for-each-group> 
    </ListOfBrandSales> 
</xsl:template> 

</xsl:stylesheet> 
+0

謝謝!這兩個例子確實幫助我理解如何在xslt中應用解決方案。 – user3570518 2014-12-04 19:52:17