对于我原来的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小组由?
答案 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>