group-by in group-by from xml to xslt

时间:2015-10-23 09:13:30

标签: xml excel xslt

0 我有像这样的xml

<rows>
    <row type="first" month="jan" value="3"/>
    <row type="first" month="feb" value="4"/>
    <row type="first" month="march" value="32"/>
    <row type="second" month="jan" value="5"/>
    <row type="second" month="march" value="6"/>
</rows>

我将它与xslt转换为excel文件,我希望我的excel文件看起来像这样:

       jan  feb march
first   3   4   32
second  5       6

我想在分组中通过分组进行,但它不起作用。我读过类似于使用模板的内容,但我没有使用xslt的经验而且我不知道如何开始。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我假设你想要csv输出,它可以由Excel导入并转换为Excel格式(.xls或.xlsx)。如果这是你想要的,那么这个XSLT 2.0样式表......

CSV输出

<xsl:transform
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    version="2.0">

<xsl:output method="text" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="rows">
  <xsl:text>type,</xsl:text>
  <xsl:variable name="months" as="xs:string*" select="fn:distinct-values( row/@month)" />
  <xsl:value-of select="$months" separator="," />
  <xsl:text>&#x0A;&#x0D;</xsl:text>
  <xsl:for-each-group select="row" group-by="@type">
    <xsl:value-of select="concat(current-grouping-key(),',')" />
    <xsl:value-of select="
         for $m in $months return
           concat( current-group()[@month eq $m]/@value,'')"
         separator="," />
  <xsl:value-of select="'&#x0A;&#x0D;'" />
  </xsl:for-each-group>
</xsl:template>

</xsl:transform>

...当应用于此输入文档时......

<rows>
    <row type="first" month="jan" value="3"/>
    <row type="first" month="feb" value="4"/>
    <row type="first" month="march" value="32"/>
    <row type="second" month="jan" value="5"/>
    <row type="second" month="march" value="6"/>
</rows>

...将生成此csv文件,该文件可导入MS Excel ...

type,jan,feb,march
first,3,4,32
second,5,,6

直接XLSX转型?

可以使用zip程序的帮助转换为xlsx,因为xlsx只是一个包含xml文件的zip文件。如果这是您想要的,请告诉我们。

关于入门

关于如何开始使用XSLT的更一般性问题,我建议您购买和阅读一本书。如果你搜索StackOverflow,已经有一些问题需要书籍推荐,并有很多答案。