我有这种xml
<?xml version="1.0"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Rows>
<Row>
<Id>1</Id>
<XColumns>
<Name>Country</Name>
<Value>Austria</Value>
</XColumns>
<XColumns>
<Name>Region</Name>
<Value>Europe</Value>
</XColumns>
<XColumns>
<Name>Sector</Name>
<Value>Information Technology</Value>
</XColumns>
<YColumns>
<Name>Dataset 1</Name>
<Value>14</Value>
</YColumns>
<YColumns>
<Name>Dataset 2</Name>
<Value>19</Value>
</YColumns>
</Row>
<Row>
<Id>2</Id>
<XColumns>
<Name>Country</Name>
<Value>Bahamas</Value>
</XColumns>
<XColumns>
<Name>Region</Name>
<Value>North American</Value>
</XColumns>
<XColumns>
<Name>Sector</Name>
<Value>Information Technology</Value>
</XColumns>
<YColumns>
<Name>Dataset 1</Name>
<Value>1</Value>
</YColumns>
<YColumns>
<Name>Dataset 2</Name>
<Value>15</Value>
</YColumns>
</Row>
我需要使用XSLT将其转换为以下XML
<?xml version="1.0"?>
<data>
<categories>
<category label="Austria"/>
<category label="Bahamas"/>
</categories>
<dataset seriesName="DataSet 1">
<set value="14"/>
<set value="1"/>
</dataset>
<dataset seriesName="DataSet 2">
<set value="19"/>
<set value="15"/>
</dataset>
还有一件事,我有一个名为“category”的变量,如果我传递category = Country,那么它将生成 类别标签,其中标签具有奥地利,巴哈马等国家的价值。如果我传递category = region,那么它将生成类别标签,其中label具有像Europe,North American这样的区域的值。因此,基于类别值,我必须生成类别标记。
答案 0 :(得分:2)
以下代码执行您尝试实现的操作。但是,根据数据集的变化方式,可能不是最有效的方法。
我假设YColumns可以以不同的顺序出现,我们可以在源文件中找到任意数量的数据集(不仅仅是2个)。如果可以删除其中一些限制,解决方案可能会更简单。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" />
<!-- Holds the category to be selected -->
<xsl:param name="category"
select="'Country'" />
<!-- Process root element -->
<xsl:template match="Data">
<data>
<xsl:apply-templates select="*" />
</data>
</xsl:template>
<xsl:template match="Rows">
<!-- Generate category based on parameter $category -->
<categories>
<xsl:apply-templates select="Row/XColumns[Name = $category]" />
</categories>
<!-- Generate data sets -->
<xsl:apply-templates select="Row[1]/YColumns" />
</xsl:template>
<!-- Generate category element -->
<xsl:template match="XColumns">
<category label="{Value}" />
</xsl:template>
<!-- Generate dataset elements -->
<xsl:template match="YColumns">
<xsl:variable name="name" select="Name" />
<dataset seriesName="{$name}">
<xsl:for-each select="../../Row/YColumns[Name = $name]/Value">
<set value="{.}" />
</xsl:for-each>
</dataset>
</xsl:template>
</xsl:stylesheet>
更新:更有效的方法是使用&lt; xsl:key&gt;索引所有YColumn名称。所以你必须添加
<xsl:key name="data-set" match="YColumns/Value" use="../Name" />
作为&lt; xsl:stylesheet&gt;
的直接子项并更改表达式
之后的表达式../../Row/YColumns[Name = $name]/Value
到
key('data-set', $name)