2013-02-25 3 views
2

일부 XML 파일을 변환하는 데 xslt를 사용하고 있습니다. 내 입력 데이터는 다음과 같습니다 : 값의 요소가 0이 아닌 경우 즉xslt를 사용하여 xml 요소 찾기

<root> 
    <item> 
    <text> 
     Feb 14, 2013 
    </text> 
    </item> 
</root> 

내가 가장 최근 날짜 요소를 찾고 있어요 :

<data> 
    <dataItem> 
    <value>24014</value> 
    <date>Feb 11, 2013</date> 
    </dataItem> 
    <dataItem> 
    <value>0</value> 
    <date>Feb 12, 2013</date> 
    </dataItem> 
    <dataItem> 
    <value>0</value> 
    <date>Feb 13, 2013</date> 
    </dataItem> 
    <dataItem> 
    <value>24627</value> 
    <date>Feb 14, 2013</date> 
    </dataItem> 
    <dataItem> 
    <value>0</value> 
    <date>Feb 15, 2013</date> 
    </dataItem> 
</data> 

내 출력 데이터는 다음과 같이해야합니다 dataItem 요소는 날짜 순서가 증가하도록 보장됩니다 (문서의 맨 위에서 시작).

나는 다음과 같이 재귀 적으로이 문제를 접근하는 시도했다 :

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

    <xsl:template name="findDate"> 
    <xsl:param name="list"/> 
    <xsl:choose> 

     <xsl:when test="value = 0"> 
     <xsl:call-template name="findDate"> 
      <xsl:with-param name="list" select="$list[position()!=1]"/> 
     </xsl:call-template> 
     </xsl:when> 

     <xsl:otherwise> 
     <root> 
      <item> 
      <text> 
       <xsl:value-of select="label"/> 
      </text> 
      </item> 
     </root> 
     </xsl:otherwise> 

    </xsl:choose> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:call-template name="findDate"> 
     <xsl:with-param name="list" select="//dataItem"/> 
     </xsl:call-template> 
    </xsl:template> 

</xsl:stylesheet> 

지금까지하지만, 그것은 작동하지 않습니다, 나는 밖으로지고있어 모두가 이것이다 :

<root> 
     <item> 
     <text> 
     </text> 
     </item> 
    </root> 

사람이 수 내가 어디로 잘못 가고 있는지 보아라.

감사합니다,

바울 dataItem 요소가 이미 date으로 분류하는 경우

답변

2

, 당신은 단지 0의 값이없는 마지막 dataItme을 잡을 수 있어야합니다. (는 XPath가이 작업을 수행하기위한 /* 템플릿의 xsl:apply-temlates 봐.)

XML 입력

<data> 
    <dataItem> 
     <value>24014</value> 
     <date>Feb 11, 2013</date> 
    </dataItem> 
    <dataItem> 
     <value>0</value> 
     <date>Feb 12, 2013</date> 
    </dataItem> 
    <dataItem> 
     <value>0</value> 
     <date>Feb 13, 2013</date> 
    </dataItem> 
    <dataItem> 
     <value>24627</value> 
     <date>Feb 14, 2013</date> 
    </dataItem> 
    <dataItem> 
     <value>0</value> 
     <date>Feb 15, 2013</date> 
    </dataItem> 
</data> 

XSLT 1.0

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

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

    <xsl:template match="/*"> 
     <root> 
      <xsl:apply-templates select="(dataItem[not(value=0)])[last()]"/>    
     </root> 
    </xsl:template> 

    <xsl:template match="dataItem"> 
     <item> 
      <xsl:apply-templates/> 
     </item> 
    </xsl:template> 

    <xsl:template match="date"> 
     <text><xsl:value-of select="."/></text> 
    </xsl:template> 

    <xsl:template match="value"/> 

</xsl:stylesheet> 

XML 출력

<root> 
    <item> 
     <text>Feb 14, 2013</text> 
    </item> 
</root> 
+0

대소 문자가 도움이됩니다. Daniel. –

3

입력 XML에 label 요소가 없기 때문에 <xsl:value-of select="label"/> 줄이 의심스러운 것 같습니다.

하지만 재귀 템플릿이 필요하지 않습니다. 다음을 시도해보십시오.

<xsl:template match="/"> 
    <root> 
     <xsl:apply-templates select="data/dataItem[value!=0][last()]"/> 
    </root> 
</xsl:template> 

<xsl:template match="dataItem"> 
    <item> 
     <text> 
      <xsl:value-of select="date"/> 
     </text> 
    </item> 
</xsl:template> 
+0

아니요, 괄호는 필요하지 않습니다. 제 예제를 사용하면 작동하는 것을 볼 수 있습니다. – nwellnhof

+0

나의 실수는, 나는 다른 예를 혼동했다. –

+0

감사합니다 nwellnhof,이 완벽하게 작동합니다. 나는 이미 다니엘의 제안을 받아 들였지만 이것을 유용한 것으로 표시 할 것이다. –

관련 문제