2014-09-10 97 views
0

我對xslt很陌生,所以任何幫助都將非常感謝。以下是我的示例xml文件。XSLT 1.0子串然後選擇不同

<DocumentElement> 
    <Records> 
     <date>2014-07-01 00:00</date> 
    </Records> 

    <Records> 
     <date>2014-08-03 00:00</date> 
    </Records> 
    <Records> 
     <date>2013-08-03 00:00</date> 
    </Records> 
<DocumentElement> 

我需要的僅僅是從日期中選擇不同的年份。

目前我有下面的xslt帶來了複製年。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:ms="urn:schemas-microsoft-com:xslt"> 
<xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 

<xsl:variable name="years" select="DocumentElement/Records/date"/> 

<ul> 
    <xsl:for-each select="$years"> 
    <li> 
     <xsl:element name="a"> 

     <xsl:attribute name="href"> 
      <xsl:value-of select="concat('?archive=',substring(., 1, 4))"/> 
     </xsl:attribute> 

     <xsl:value-of select="substring(., 1, 4)"/> 
     </xsl:element> 

    </li> 
    </xsl:for-each> 
</ul> 
    </xsl:template> 

</xsl:stylesheet> 

這使我的結果如下:

<ul> 
    <li> 
    <a href="?archive=2014">2014</a> 
</li> 
<li> 
    <a href="?archive=2014">2014</a> 
</li> 
<li> 
    <a href="?archive=2014">2013</a> 
    </li> 
</ul> 

但是我預期的結果應該是

<ul> 
    <li> 
    <a href="?archive=2014">2014</a> 
</li> 

<li> 
    <a href="?archive=2014">2013</a> 
    </li> 
</ul> 

我嘗試下面的下面,但我得到空的輸出

<?xml version="1.0" encoding="utf-8"?> 
     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:ms="urn:schemas-microsoft-com:xslt"> 
    <xsl:output method="xml" indent="yes"/> 


    <xsl:template match="/"> 

    <xsl:variable name="years" select="substring(DocumentElement/Records/date, 1, 4)"/> 

    <ul> 
    <xsl:for-each select="$years[not(.=preceding::*)]"> 
    <li> 
     <xsl:element name="a"> 

     <xsl:attribute name="href"> 
      <xsl:value-of select="concat('?archive=',substring(., 1, 4))"/> 
     </xsl:attribute> 

     <xsl:value-of select="substring(., 1, 4)"/> 
     </xsl:element> 

    </li> 
    </xsl:for-each> 
</ul> 
</xsl:template> 

    </xsl:stylesheet> 

任何幫助將會非常感謝。謝謝。

回答

3

Muenchian分組在XSLT1.0中的分組方式比使用之前/之後/之前同級/之後同級軸更有效。試試這個:

<?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:key name="Date" match="DocumentElement/Records/date" use="substring(.,1,4)"/> 
<xsl:template match="/"> 
    <ul> 
     <xsl:for-each select="DocumentElement/Records/date[generate-id() = generate-id(key('Date', substring(.,1,4))[1])]"> 
      <li> 
       <a href="{concat('?archive=',substring(.,1,4))}"> 
        <xsl:value-of select="substring(., 1, 4)"/> 
       </a> 
      </li> 
     </xsl:for-each> 
    </ul> 
</xsl:template> 
</xsl:stylesheet> 
+0

非常感謝。它的工作就像一個魅力 – dansasu11 2014-09-10 14:23:38