2013-02-19 8 views
1

내가 XSLT에게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> 

한 가지 더를 사용하여 다음과 같은 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> 

XML의 종류가, 내가 하나 개의 변수를 불렀다 "category", category = Country를 전달하면 category 태그에 레이블이있는 위치를 생성합니다. v 오스트리아, 바하마 같은 나라의 alue. category = region을 전달하면 레이블에 Europe, North American과 같은 지역의 가치가있는 category 태그가 생성됩니다. 카테고리 값을 기반으로 카테고리 태그를 생성해야합니다.

+0

로 표현

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

다음 식을 스타일>

변경 : 그래서 당신은 < XSL의 직접적인 자식으로

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

를 추가해야 내 대답은보다 효율적인 접근 방식입니다. –

답변

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> 

UPDATE : 인덱스에 모든 YColumn 이름을 키> :보다 효율적인 접근 방법은 < XSL을 사용하고 있습니다. 내가 추가 한

key('data-set', $name) 
관련 문제