2014-12-04 40 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