2013-02-20 2 views
0

그래서 XML에서 얻은 모든 고유 한 연도를 날짜에서 가져 와서 연도를 반복하여 해당 연도의 모든 결과를 얻습니다. 아래의 코드는 포인트까지만 작동하지만, 날짜 문자열의 일부 (고유 한 값을 얻기위한 4 개의 예기치 않은 계산자 등)로 고유 한 값을 얻는 방법을 찾을 수 없기 때문에 고유 한 전체 날짜 만 반환합니다. xpath 내에서 부분 문자열을 사용하는 것이 좋지만 시도한 모든 부분이 실패한 것 같습니다. 아무도 내가 여기서해야만하는 것을 알고 있습니까?xpath에서 xsl 하위 문자열

그래서 첫 번째 결과로 반환 할 값은 201220112010입니다.

아래 코드는 xslt 1.0을 사용하는 코드입니다. 나는

<!-- key at top of document --> 
<xsl:key name="product" match="gdr:CompanyHistory/gdr:Event/gdr:Date" use="." /> 

<xsl:for-each select="gdr:CompanyHistory/gdr:Event/gdr:Date[generate-id()=generate-id(key('product',.)[1])]"> 
     <strong>Year = <xsl:value-of select="substring(., 1, 4)"/></strong> 
     <ul> 
      <xsl:variable name="Date" select="."/> 
      <!-- foreach year get all results that have dates in that year. --> 
      <xsl:for-each select="gdr:CompanyHistory/gdr:Event[substring(gdr:Date, 1, 4) = $Date]"> 
       <li><xsl:value-of select="gdr:Description" /> - <xsl:value-of select="gdr:Date" /></li> 
      </xsl:for-each> 
     </ul> 
     </xsl:for-each> 

는 XML 나는이 감각의 일종을 만드는 희망

<CompanyHistory> 
<Event> 
    <Date>2012-02-16T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2012-02-01T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2011-03-01T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2011-04-01T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2010-01-26T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2010-01-16T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
</CompanyHistory> 

... 그래서 간단하게 뭔가를 누락 될 수 있습니다 XSLT 작업에 비교적 새로운 해요. 참고 : 전체 xpath를 더 읽기 쉽도록 줄였습니다.

+0

코드의 문제로 변환되어 입력되는 스타일 시트와 그래서

답변

1

나는 그 해에만 키를 정의한 다음 Muenchian 그룹을 사용합니다.

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

<xsl:output method="html" indent="yes"/> 

<xsl:key name="year" match="CompanyHistory/Event" use="substring(Date, 1, 4)"/> 

<xsl:template match="CompanyHistory"> 
    <xsl:apply-templates select="Event[generate-id() = generate-id(key('year', substring(Date, 1, 4))[1])]" mode="group"/> 
</xsl:template> 

<xsl:template match="Event" mode="group"> 
    <h2>Year = <xsl:value-of select="substring(Date, 1, 4)"/></h2> 
    <ul> 
    <xsl:apply-templates select="key('year', substring(Date, 1, 4))"/> 
    </ul> 
</xsl:template> 

<xsl:template match="Event"> 
    <li> 
    <xsl:value-of select="Description"/> 
    <xsl:text> - </xsl:text> 
    <xsl:value-of select="Date"/> 
    </li> 
</xsl:template> 

</xsl:stylesheet> 

<CompanyHistory> 
<Event> 
    <Date>2012-02-16T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2012-02-01T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2011-03-01T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2011-04-01T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2010-01-26T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
<Event> 
    <Date>2010-01-16T00:00:00</Date> 
    <Description>description</Description> 
</Event> 
</CompanyHistory> 

<h2>Year = 2012</h2> 
<ul> 
    <li>description - 2012-02-16T00:00:00</li> 
    <li>description - 2012-02-01T00:00:00</li> 
</ul> 
<h2>Year = 2011</h2> 
<ul> 
    <li>description - 2011-03-01T00:00:00</li> 
    <li>description - 2011-04-01T00:00:00</li> 
</ul> 
<h2>Year = 2010</h2> 
<ul> 
    <li>description - 2010-01-26T00:00:00</li> 
    <li>description - 2010-01-16T00:00:00</li> 
</ul> 
+0

고맙습니다. 완벽하게 작동합니다. :) 나는이 방법을 몰랐다. – HannahW

+0

@ user2087471, "완벽하게"작동한다면, 마틴의 대답을 받아 들여주세요. 답변 옆에있는 체크 표시를 클릭하기 만하면됩니다. –

관련 문제