2013-05-28 62 views
0

我是XSLT的新手,但最近我不得不編寫自己的xslt來處理XML,我寫了一些東西,但是我想問問專業人員,如果我做得很好,或者還有更多我能做的做改進。使用模板的XSLT,我在正確的方式?

我知道XSLT使用模板和東西,但在我的XSLT中,我認爲測試中有太多可重複的東西......可以減少嗎?

這裏是我的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:param name="Today" /> 
    <xsl:param name="ViewType" /> 
    <xsl:template match="/"> 
    <table> 
     <tr> 
      <th>Priority</th> 
      <th>Title</th> 
      <th>Due date</th> 
     </tr> 
     <xsl:apply-templates select="All_Results/Result"> 
     <xsl:sort select="duedate" /> 
     </xsl:apply-templates> 
    </table> 
    </xsl:template> 

    <xsl:template match="Result"> 
    <xsl:variable name="varOverdue" select="ddwrt:DateTimeTick(ddwrt:GenDisplayName(string(duedate))) &lt; ddwrt:DateTimeTick(ddwrt:GenDisplayName(string($Today)))" ddwrt:cf_explicit="1"/> 
    <xsl:variable name="varOverduePlus14" select="ddwrt:DateTimeTick(ddwrt:GenDisplayName(string(duedate))) &lt; ddwrt:DateTimeTick(ddwrt:GenDisplayName(string($Today)))+12096000000000" ddwrt:cf_explicit="1"/> 
    <xsl:variable name="varOverdueToday" select="ddwrt:DateTimeTick(ddwrt:GenDisplayName(string(duedate))) = ddwrt:DateTimeTick(ddwrt:GenDisplayName(string($Today)))" ddwrt:cf_explicit="1"/> 
    <xsl:choose> 
     <xsl:when test="$ViewType='active'"> 

      <xsl:if test="($varOverdue=0) and (taskstatus ='In Progress')">   
       <tr>     
        <td><xsl:value-of select="priority"/></td> 
        <td> 
         <a> 
         <xsl:attribute name="href"> 
          <xsl:value-of select="url"/> 
         </xsl:attribute> 
         <xsl:attribute name="title"> 
          <xsl:value-of select="title"/> 
         </xsl:attribute> 
         </a>       
        </td> 
        <td> 
         <xsl:value-of select="duedate"/> 
        </td> 
       </tr> 
      </xsl:if> 

     </xsl:when> 
     <xsl:when test="$ViewType='overdue'"> 
      <xsl:if test="($varOverdue=1) and (taskstatus !='Completed')">   
       <tr>     
        <td><xsl:value-of select="priority"/></td> 
        <td> 
         <a> 
         <xsl:attribute name="href"> 
          <xsl:value-of select="url"/> 
         </xsl:attribute> 
         <xsl:attribute name="title"> 
          <xsl:value-of select="title"/> 
         </xsl:attribute> 
         </a>       
        </td> 
        <td> 
         <xsl:attribute name="style"> 
          color:red; 
         </xsl:attribute> 
         <xsl:value-of select="duedate"/> 
        </td> 
       </tr> 
      </xsl:if> 
     </xsl:when> 
     <xsl:when test="$ViewType='upcoming'">  
      <xsl:if test="(taskstatus !='Completed') and ($varOverduePlus14=1)">   
       <tr>     
        <td><xsl:value-of select="priority"/></td> 
        <td> 
         <a> 
         <xsl:attribute name="href"> 
          <xsl:value-of select="url"/> 
         </xsl:attribute> 
         <xsl:attribute name="title"> 
          <xsl:value-of select="title"/> 
         </xsl:attribute> 
         </a>       
        </td> 
        <td> 
         <xsl:if test="$varOverdue=1"> 
          <xsl:attribute name="style"> 
           color:red; 
          </xsl:attribute> 
         </xsl:if> 
         <xsl:value-of select="duedate"/> 
        </td> 
       </tr> 
      </xsl:if>   
     </xsl:when> 
    </xsl:choose> 

    </xsl:template> 

</xsl:stylesheet> 

的XML看起來是這樣的:

<All_Results> 
    <Result> 
     <id>1</id> 
     <workid>2258</workid> 
     ... 
    </Result> 
    <Result> 
     <id>2</id> 
     <workid>4537</workid> 
     .... 
    </Result> 
    ... 
</All_Results> 

那麼,有沒有改善我的XSLT來解析當前XML的方法嗎?

+0

發佈您的預期輸出將有助於人們分析您的XSLT並提出改進建議。 –

回答

1

是的,你應該能夠大大鞏固這一點,就像這樣:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:param name="Today" /> 
    <xsl:param name="ViewType" /> 
    <xsl:template match="/"> 
    <table> 
     <tr> 
     <th>Priority</th> 
     <th>Title</th> 
     <th>Due date</th> 
     </tr> 
     <xsl:variable name="results" select="All_Results/Result" /> 
     <xsl:apply-templates select="$results[1]"> 
     <xsl:sort select="duedate" /> 
     <xsl:with-param name="remaining" select="$results[position() > 1]" /> 
     </xsl:apply-templates> 
    </table> 
    </xsl:template> 

    <xsl:template match="Result"> 
    <xsl:param name="num" select="1" /> 
    <xsl:param name="remaining" select="/.." /> 

    <xsl:variable name="dueDateTick" 
       select="ddwrt:DateTimeTick(ddwrt:GenDisplayName(string(duedate)))" /> 
    <xsl:variable name="todayTick" 
       select="ddwrt:DateTimeTick(ddwrt:GenDisplayName(string($Today)))" /> 

    <xsl:variable name="varOverdue" select="$dueDateTick &lt; $todayTick" 
        ddwrt:cf_explicit="1" /> 
    <xsl:variable name="varOverduePlus14" 
        select="$dueDateTick &lt; $todayTick +12096000000000" 
        ddwrt:cf_explicit="1" /> 
    <xsl:variable name="varOverdueToday" select="$dueDateTick = $todayTick" 
        ddwrt:cf_explicit="1"/> 

    <xsl:variable name="shouldInclude" 
        select="($ViewType = 'active' and not($varOverdue) 
          and taskstatus = 'In Progress') or 
          ($ViewType = 'overdue' and $varOverdue and 
          taskstatus != 'Completed') or 
          ($ViewType = 'upcoming' and taskstatus != 'Completed' and 
          $varOverduePlus14)" /> 
    <xsl:apply-templates select="current()[$shouldInclude]" 
         mode="content"> 
     <xsl:with-param name="varOverdue" select="$varOverdue" /> 
     <xsl:with-param name="num" select="$num" /> 
    </xsl:apply-templates> 

    <xsl:apply-templates select="$remaining[1]"> 
     <xsl:with-param name="num" select="$num + $shouldInclude" /> 
     <xsl:with-param name="remaining" select="$remaining[position() > 1]" /> 
    </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="Result" mode="content"> 
    <xsl:param name="varOverdue" /> 
    <xsl:param name="num" /> 

    <tr> 
     <td> 
     <xsl:value-of select="priority"/> 
     </td> 
     <td> 
     <a href="{url}" title="{title}"> 
      You'll need some text here 
     </a> 
     </td> 
     <td> 
     <xsl:if test="$num mod 2 = 0"> 
      <xsl:attribute name="class">ms-alternating ms-itmhover</xsl:attribute> 
     </xsl:if> 
     <xsl:apply-templates select="current()[$varOverdue]" 
          mode="dueDateStyle" /> 
     <xsl:value-of select="duedate"/> 
     </td> 
    </tr> 
    </xsl:template> 

    <xsl:template match="*" mode="dueDateStyle"> 
    <xsl:attribute name="style"> 
     <xsl:text>color: red;</xsl:text> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

我不能對此進行測試,因爲我沒有獲得您所使用的擴展功能,但請試試這個,讓我知道它是怎麼回事。

+0

我不知道它會起作用嗎?只是事情是我可能忘了說,由於我發送的參數,這是活躍/逾期或即將到來的,正確的任務應該顯示,但我看到這裏的一切都會呈現,而不是參數視圖類型。或者,也許我不明白,很難重新檢查 – Alnedru

+0

噢好,它似乎工作,但我怎麼可以交替添加到這? – Alnedru

+0

「交替」是什麼意思? – JLRishe