Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt xpath中的xsl子字符串_Xslt_Xslt 1.0 - Fatal编程技术网

Xslt xpath中的xsl子字符串

Xslt xpath中的xsl子字符串,xslt,xslt-1.0,Xslt,Xslt 1.0,因此,我试图从xml中获取日期的所有唯一年份,然后循环遍历这些年份,以获取该年份的所有结果。下面的代码在一定程度上起作用,但目前它只返回唯一的完整日期,因为我无法确定如何通过日期字符串的一部分获取唯一值(前四个字符,例如2012)。我想在xpath中使用子字符串,但我尝试过的一切似乎都失败了。有人知道我应该在这里做什么吗 所以我想让第一个结果返回这些值201220112010 下面是我使用的代码-使用XSLT1.0。我对使用xslt比较陌生,所以我可能缺少一些简单的东西 <!-- key

因此,我试图从xml中获取日期的所有唯一年份,然后循环遍历这些年份,以获取该年份的所有结果。下面的代码在一定程度上起作用,但目前它只返回唯一的完整日期,因为我无法确定如何通过日期字符串的一部分获取唯一值(前四个字符,例如2012)。我想在xpath中使用子字符串,但我尝试过的一切似乎都失败了。有人知道我应该在这里做什么吗

所以我想让第一个结果返回这些值201220112010

下面是我使用的代码-使用XSLT1.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>

2012-02-16T00:00:00
描述
2012-02-01T00:00:00
描述
2011-03-01T00:00:00
描述
2011-04-01T00:00:00
描述
2010-01-26T00:00:00
描述
2010-01-16T00:00:00
描述

我希望这有点道理。注意:我缩短了完整的xpath以使其更具可读性

我只为年份定义键,然后使用明钦分组。所以样式表是

<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>
    
    
    2012-02-16T00:00:00
    描述
    2012-02-01T00:00:00
    描述
    2011-03-01T00:00:00
    描述
    2011-04-01T00:00:00
    描述
    2010-01-26T00:00:00
    描述
    2010-01-16T00:00:00
    描述
    
    变成

    <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>
    
    Year=2012
    
    • 描述-2012-02-16T00:00:00
    • 描述-2012-02-01T00:00:00
    年份=2011年
    • 描述-2011-03-01T00:00:00
    • 描述-2011-04-01T00:00:00
    年份=2010年
    • 描述-2010-01-26T00:00:00
    • 描述-2010-01-16T00:00:00

    代码的问题是,您有
    ,然后在每个比较
    子字符串的内部(gdr:Date,1,4)=$Date
    (即比较一个日期的前四个字符与另一个日期的整个字符)。但马丁的答案肯定是正确的——使用“按年度直接分组”键。非常感谢,这非常有效:)。我不知道这个方法。@user2087471,如果它“工作完美”,那么请接受马丁的回答。只需单击答案旁边的复选标记。