XSLT按唯一元素值分组?

时间:2012-10-22 19:10:07

标签: xslt

对于我原来的XML,我有类似的东西:

<Data>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type A</Type>
    <Key>Cases</Key>
    <Value>3</Value>
   </Statistic>
   <Statistic>
    <Title>PHYSICIAN DETAIL TOTAL</Title>
    <Type>Type A</Type>
    <Key>Percentage</Key>
    <Value>75.0%</Value>
   </Statistic>
   <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <Key>Cases</Key>
    <Value>1</Value>
   </Statistic>
   <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <Key>Percentage</Key>
    <Value>25.0%</Value>
   </Statistic>
</Data>

基本上,对于每种类型,只有一个&#34;案例&#34;和一个&#34;百分比&#34;。 最终的XML将如下所示:

<Data>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type A</Type>
    <count>
      <Case>1</Case>
      <Percentage>75%</Percentage>
    </count>
  </Statistic>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <count>
       <Case>1</Case>
       <Percentage>25%</Percentage>
    </count>
  </Statistic>
</Data>

实现这一目标的最佳方法是什么? XSLT小组由?

2 个答案:

答案 0 :(得分:0)

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

    <xsl:output indent="yes"/>

    <xsl:key name="stat-key" match="/Data/Statistic" use="Type"/>

    <xsl:template match="/">
        <Data>
            <xsl:apply-templates select="/Data/Statistic[generate-id()=generate-id(key('stat-key',Type)[1])]">
                <xsl:sort select="Type"/>
            </xsl:apply-templates>
        </Data>
    </xsl:template>

    <xsl:template match="Statistic">
        <xsl:copy>
            <xsl:copy-of select="Title|Type"/>
            <count>
                <Case>
                    <xsl:value-of select="key('stat-key', Type)[Key='Cases']/Value"/>
                </Case>
                <Percentage>
                    <xsl:value-of select="key('stat-key', Type)[Key='Percentage']/Value"/>
                </Percentage>
            </count>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

它会为每个Title组选择Statistic的{​​{1}}。

<强>输出

Type

答案 1 :(得分:0)

OP似乎在说每个统计数据中只有一个Case子项,而每个统计数据中只有一个百分比子项。在这种情况下,分组是没有必要的,解决方案变得微不足道。

**这个XSLT 1.0样式表(也适用于XSLT 2.0)......

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="@*|node()">
  <xsl:copy>
     <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Statistic[Key='Percentage']" />

<xsl:template match="Statistic">
  <xsl:copy>
     <xsl:apply-templates select="@*|node()[not(self::Key|self::Value)]"/>
     <count>
       <Case><xsl:value-of select="Value" /></Case>
       <Percentage><xsl:value-of select=
         "../Statistic[Type=current()/Type][Key='Percentage']/Value" />
       </Percentage>
     </count>   
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

...应用于此文档时......

<Data>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type A</Type>
    <Key>Cases</Key>
    <Value>3</Value>
   </Statistic>
   <Statistic>
    <Title>PHYSICIAN DETAIL TOTAL</Title>
    <Type>Type A</Type>
    <Key>Percentage</Key>
    <Value>75.0%</Value>
   </Statistic>
   <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <Key>Cases</Key>
    <Value>1</Value>
   </Statistic>
   <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <Key>Percentage</Key>
    <Value>25.0%</Value>
   </Statistic>
</Data>

<强> ...产量...

<Data>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type A</Type>
    <count>
      <Case>3</Case>
      <Percentage>75.0%</Percentage>
    </count>
  </Statistic>
  <Statistic>
    <Title>Total Values</Title>
    <Type>Type B</Type>
    <count>
      <Case>1</Case>
      <Percentage>25.0%</Percentage>
    </count>
  </Statistic>
</Data>