0

だから私がやろうとしているのは、xml から日付からすべての一意の年を取得し、年をループしてその年からすべての結果を取得することです。以下のコードはある程度機能しますが、現時点では、日付文字列の一部 (2012 などの最初の 4 文字) で一意の値を取得する方法がわからないため、一意の完全な日付のみを返します。xpath内で部分文字列を使用することを考えていますが、私が試したものはすべて失敗したようです。私がここで何をすべきか知っている人はいますか?

したがって、最初の結果に返してもらいたいのは、これらの値 2012,2011,2010 です。

これは私が以下で使用しているコードです - xslt 1.0 を使用しています。私は xslt の操作に比較的慣れていないので、単純なものが欠けている可能性があります...

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

これが何らかの意味を成すことを願っています。注: 読みやすくするために、完全な xpath を短縮しました。

4

1 に答える 1

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>
于 2013-02-20T11:13:11.823 に答える