2013-02-19 80 views
1

我有这样的XML的如何根据给定的值在xslt中选择节点/值?

<?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 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> 

1件事,把它转换为下面的XML,我已要求一个变量“类别”,如果我通过category = Country,那么它会生成 类别标签,其中标签具有v像奥地利,巴哈马这样的国家。如果我传递category = region,那么它将生成类别标签,其中标签具有欧洲,北美等地区的值。所以根据类别价值,我必须生成类别标签。

+0

我已经加入到如果您有兴趣,我的答案是更高效的方法 – 2013-02-19 13:18:18

回答

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> 

更新:一个更有效的方法是使用XSL <:键>索引所有YColumn名。所以,你必须添加

<xsl:key name="data-set" match="YColumns/Value" use="../Name" /> 

为< XSL直接子:下面的表达式

../../Row/YColumns[Name = $name]/Value 

样式表>

和更改表达

key('data-set', $name)