ToDoList樣式表:教程


介紹 我剛剛為TDL構建了一個定制樣式表,這是我的第一個XSLT文件,對於從未接觸過XSLT文件的人來說,這不是一項容易的任務。使用TDL交付的樣式表不適合初學者學習,這並不奇怪,但令我驚訝的是,所有所需的信息都分布在如此多的地方。 所以,我寫這篇文章是為了把我發現有用的東西放在一起,希望它能幫助您為ToDoList創建自己的樣式表。 記住,英語對我來說還是一門外語。請隨意報告錯誤。 背景 對於初學者來說,了解XML格式的基本知識更佳,了解HTML也會有幫助。對於高級樣式表,必須了解XML、HTML和XPath。 XML文件格式 快速介紹XML文件格式。ToDoList的任務列表和樣式表是XML文件。 XML文件的基本結構是元素,元素由開始標記和結束標記組成。 隱藏,復制Code

<TODOLIST>
</TODOLIST>

元素的開始標記可以包含屬性,值與每個attibute相關聯,值始終是字符串,甚至是數值。 隱藏,復制Code

<TODOLISTPROJECTNAME="My TaskList"FILEFORMAT="10">
</TODOLIST>

元素可以包含嵌套在兩個標記之間的一些文本或其他元素。 隱藏,復制Code

<TODOLISTPROJECTNAME="My TaskList"FILEFORMAT="10">
  <TASKTITLE="My first Task">
    <TASKTITTLE="My sub task">
      <COMMENTS>My comments</COMMENTS>
    </TASK>
  </TASK>
  <TASKTITLE="My second Task">
  </TASK>
</TODOLIST>

XML文件由一個主元素組成,其中包含嵌套的所有內容。就XML文件本身而言,它被組織成樹,單個主元素是樹的根。 在以前snipset: TODOLIST是根元素。它還包含其他元素。任務是一個元素。它還包含其他元素。注釋是一個元素。它包含文本。PROJECTNAME是todolist文件格式的屬性是todolist title任務的屬性 任務列表包含更多的元素和屬性。 關於XML、XSLT、HTML或XPath的更多細節,我推薦w3schools.com 首先,獲取一個TDL樣式表示例 首先,我搜索了一個示例樣式表,並發現文章XSL Transform for ToDoList包含了一個TDL樣式表,目的是作為一個示例。我的第一個實驗相當令人沮喪,直到我明白這個示例有很多bug。 下面是對樣式表的更正。 任何需要它的地方,都要替換它 隱藏,復制Code

<xsl:apply-templates/>

與 隱藏,復制Code

<xsl:apply-templatesselect="TASK"/>

,替換 隱藏,復制Code

... "@COMMENTS"

與 隱藏,復制Code

... "COMMENTS"

經過修正后,示例工作得好得多。更正后的文件是bpsToDoListStyler_Rev019.xsl。 試驗示例樣式表 為了處理這個示例,我建議從樹視圖開始並獲得所有屬性。輸出格式為HTML,可用於打印、預覽或轉換任務列表。很多選項都被注釋掉了,只要取消注釋就可以看到會追加什么。 ToDoList如何處理樣式表 TDL可以將樣式表用於打印、導出或轉換等操作。在每種情況下,TDL都會生成一個反映實際設置的特定臨時任務列表,樣式表將應用於該臨時任務列表。 特定的任務列表是使用這些准則來構建的: 如果在樹視圖中,臨時列表將是樹,如果在列表視圖中,臨時列表將是平面的。將使用實際排序。對話框允許您選擇包含哪些任務和哪些屬性。 選擇你想要的結果: 打印:輸出將被打印在紙上。預覽:輸出結果在屏幕上顯示與打印結果相同。轉換:如果使用文本或HTML格式,輸出將保存在磁盤上,並顯示在internet導航器上。打印和預覽的區別在於HTML不局限於可打印特性。轉換的另一種用法是生成其他XML文件。 臨時任務列表文件存儲在目錄%temp%中,文件名為任務列表名稱后接. intermediator .txt。MyTasks的臨時文件。tdl將是%temp%目錄中的mytask . intermediator .txt。在文本編輯器中打開以查看結構以及文件中的元素和屬性。 TDL樣式表的缺陷 空的結果 存在的問題: 這一切都在標題中。結果為空。 答案是: 第一種可能是編譯錯誤。你必須找出錯誤所在並加以改正。不幸的是,TDL沒有提供任何關於出錯原因的基本線索。如果您沒有任何類型的調試器,最好是從一個通用的工作示例開始,然后通過測試進行增量更改,以驗證每個更改。 第二種可能是沒有匹配或沒有輸出。首先,確保您的樣式表總是在根匹配時輸出一些內容。要做到這一點,最簡單的方法是確保將任務列表的內容放到結果中。通過獲得結果,可以確保樣式表編譯成功。如果你沒有得到你應該得到的,一定是邏輯上的錯誤的樣式表。 使用<xsl:template match="/">模板 存在的問題: 顯然,沒有遍歷XML樹,如果 隱藏,復制Code

<xsl:templatematch="/">

被替換為 隱藏,復制Code

<xsl:templatematch="/TODOLIST">

,一切正常。 答案是: 整個技巧就是<xsl:template match="/">當需要任務時,匹配XML文檔和子元素是TODOLIST。 如果您有一個文檔匹配模板,那么還需要一個根匹配模板,因為前者必須調用后者。 口音在樣式表 存在的問題: 當您使用重音符號時,文件編碼可能會成為一個問題,這個問題非常大,即使只是在注釋中,也足以導致編譯失敗。您需要應用正確的編碼。 答案是: 為了解決這個問題,有兩個地方需要檢查: 在xml標簽中聲明編碼: 隱藏,復制Code< ?編碼="utf-8" ?> 在您的文本編輯器中,選擇符合您需要的字符編碼:UTF-8, UTF-16, iso-8859-1… UTF-8通常是一個不錯的選擇。在任何情況下,確保兩者都匹配。 在沒有“模板”的元素上執行“應用模板” 存在的問題: 這就是TDL示例中的錯誤。通用 隱藏,復制Code

<xsl:apply-templates/>

將匹配當前元素中的任何元素。當您遇到注釋(或任何不是任務的元素)時,就會出現問題。由於注釋沒有匹配的模板,因此應用默認行為,注釋中的文本被簡單地轉儲到輸出。 這就是在運行原始的錯誤示例(如文件bpsToDoListStyler_Rev018.xsl)時出現未格式化文本的原因。 答案是: 僅對嵌套任務使用應用程序模板。 隱藏,復制Code

<xsl:apply-templatesselect="TASK"/>

Nota:同樣的問題也適用於TDL 6.9.6和更早的樣式表:Project-Overview-HTML。xsl, SimpStyler0.2。xsl, TodoListStyler_Firefox。xsl和TodoListStyler_v1.5.xsl 另一種選擇是聲明一個模板來匹配所有內容。 隱藏,復制Code

<xsl:templatematch="*">

小心你所做的事情,如果沒有掌握它,它就像危險一樣強大,它很容易導致不想要的結果。 XML樣式表snipsets XML文件的組織方式類似於樹,而XSLT基本上是在應用轉換時遍歷樹,如果輸入樹結構與輸出樹結構不匹配,可以通過更復雜的編程來完成更復雜的轉換。 有些例子使用html標記,請參閱下一章,了解樣式表中的html標記。 XSLT的評論 建議:在不明顯的地方用注釋記錄xslt樣式表。 隱藏,復制Code

<!-- My Comments anywhere I need -->

初學者經常認為記錄是浪費時間,這是錯誤的。您會發現,在6個月或一年后重新查看代碼並不是浪費時間,因為注釋可以幫助您回憶代碼的意圖。 樣式表組織 xslt基於模板匹配語言。這意味着沒有顯式的入口點,也沒有顯式的匹配模板鏈接,它是數據驅動的。如果有多個模板與當前數據匹配,這不是錯誤,只是在運行時通過遵循一些規則選擇正確的模板。 樣式表發射 樣式表總是先嘗試執行與整個文檔匹配的模板。 隱藏,復制Code

<xsl:templatematch="/">

如果失敗,解釋器將尋找匹配XML文件根的模板。就像 隱藏,復制Code

<xsl:templatematch="/TODOLIST">

它是一個只匹配名為TODOLIST的根元素的模板。或 隱藏,復制Code

<xsl:templatematch="TODOLIST">

該模板只匹配名為TODOLIST的元素,不需要匹配根元素。 匹配的模板 注意,XSLT代碼中沒有鏈接匹配的模板。 隱藏,復制Code

<xsl:apply-templates/>

將動態決定調用哪個匹配模板以及調用順序。為了對樣式表的執行保持一定的控制,最好使用語法 隱藏,復制Code

<xsl:apply-templatesselect="TASK"/>

指定要匹配的元素。 你好,世界 經典的一個。HelloWord看到文件。xsl表示完整示例。 隱藏,復制Code

<?xmlversion="1.0"?>
<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">
    <xsl:outputmethod="text"/>
    
    <xsl:templatematch="/">
        <xsl:text>Hello Word</xsl:text>
    </xsl:template>
</xsl:stylesheet>

& lt; xsl:輸出方法= " text " /比;告訴輸出是原始文本,沒有格式化,什么都沒有,只是文本。 & lt; xsl:模板匹配= " / "比;匹配任何文檔的根元素。 元素& lt; xsl: text>包圍您想要輸出的文本 你好,基於網絡 參見文件TDLSS 1。xsl表示完整示例。 隱藏,復制Code

<?xmlversion="1.0"?>
<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">
    <xsl:outputmethod="html"indent="yes"doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>
    
    <xsl:templatematch="/TODOLIST">
        <xsl:elementname="html">
            <xsl:elementname="body">
                <xsl:text>Hello ToDoList</xsl:text>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

輸出方法="html"…告知輸出是html頁面,具有所有常見的格式,但代價有點復雜。 & lt; xsl:模板匹配= " /基於網絡”在將只匹配名為TODOLIST的根元素,這是任務列表的根元素的名稱。 讀屬性值 參見文件TDLSS 2。xsl表示完整示例。 隱藏,復制Code

<xsl:template match="TODOLIST">
    <xsl:element name="html">
        <xsl:element name="head">
            <xsl:element name="title">
                <xsl:value-of select="@PROJECTNAME" />
            </xsl:element>
        </xsl:element>
        <xsl:element name="body">
            <xsl:value-of select="@PROJECTNAME" />
            <xsl:element name="br" />
            <xsl:value-of select="@FILENAME" />
            <xsl:element name="br" />
        </xsl:element>
    </xsl:element>
</xsl:template>

& lt; xsl:是選擇= " @PROJECTNAME " /比;輸出PROJECTNAME屬性的值。 遍歷樹 參見文件TDLSS 3。xsl表示完整示例。 隱藏,復制Code

<xsl:template match="TODOLIST">
    <xsl:element name="html">
        <xsl:element name="head">
            <xsl:element name="title">
                <xsl:value-of select="@PROJECTNAME" />
            </xsl:element>
        </xsl:element>
        <xsl:element name="body">
            <xsl:value-of select="@PROJECTNAME" />
            <xsl:element name="br" />
            <xsl:value-of select="@FILENAME" />
            <xsl:element name="br" />
            <xsl:element name="br" />
            <xsl:apply-templates select="TASK" />
        </xsl:element>
    </xsl:element>
</xsl:template>

<xsl:template match="TASK">
    <xsl:value-of select="@TITLE" />
    <xsl:element name="br" />
</xsl:template>

select="TASK" />尋找名為TASK的元素,它是TODOLIST元素的子元素,並將應用template <每次出現。 遞歸地遍歷樹 參見文件TDLSS 4。xsl表示完整示例。 隱藏,復制Code

<xsl:template match="TASK">
    <xsl:value-of select="@TITLE" />
    <xsl:element name="br" />
    <xsl:apply-templates select="TASK" />
</xsl:template>

select="TASK" />是使樹遍歷遞歸的原因。 讀取文本元素值 參見文件TDLSS 5。xsl表示完整示例。 隱藏,復制Code

<xsl:templatematch="TASK">
    <xsl:value-ofselect="@TITLE"/>
    <xsl:elementname="br"/>
    <xsl:text>CATEGORY: </xsl:text>
    <xsl:value-ofselect="CATEGORY"/>
    <xsl:elementname="br"/>
    <xsl:text>COMMENTS: </xsl:text>
    <xsl:value-ofselect="COMMENTS"/>
    <xsl:elementname="br"/>
    <xsl:elementname="br"/>
    <xsl:apply-templatesselect="TASK"/>
</xsl:template>

select="COMMENTS" />輸出COMMENTS文本元素的值。 單一的條件:如果 參見文件TDLSS 6。xsl表示完整示例。 隱藏,復制Code

<xsl:iftest="COMMENTS">
    <xsl:text>COMMENTS: </xsl:text>
    <xsl:value-ofselect="COMMENTS"/>
    <xsl:elementname="br"/>
</xsl:if>

xsl: if 當測試為真時做某事,當測試為假時不做任何事。 多個條件:選擇 參見文件TDLSS 7。xsl表示完整示例。 隱藏,復制Code

<xsl:choose>
    <xsl:whentest="COMMENTS">
        <xsl:text>COMMENTS: </xsl:text>
        <xsl:value-ofselect="COMMENTS"/>
        <xsl:elementname="br"/>
    </xsl:when>
    <xsl:otherwise>
        <xsl:text>No COMMENT</xsl:text>
    </xsl:otherwise>
</xsl:choose>

choose是一種多條件結構。第一個是執行結構時(為真),如果沒有測試為真,則執行其他結構。 調用一個模板 參見文件TDLSS 8。xsl表示完整示例。 隱藏,復制Code

    <xsl:call-templatename="fix-breaks">
        <xsl:with-paramname="text">
            <xsl:value-ofselect="COMMENTS"/>
        </xsl:with-param>
    </xsl:call-template>
    . . .
<xsl:templatename="fix-breaks">
    <xsl:paramname="text"/>
    . . .
</xsl:template>

模板名="fix-break ">都是其他語言的子程序。它們由<xsl:call-template name="fix-break "調用> 固定休息 參見文件TDLSS 8。xsl表示完整示例。 隱藏,復制Code

<xsl:templatename="fix-breaks">
    <xsl:paramname="text"/>
    <xsl:choose>
        <xsl:whentest="contains($text,'&#13;&#10;')">
            <xsl:value-ofselect="substring-before($text,'&#13;&#10;')"/>
            <xsl:elementname="br"/>
            <xsl:call-templatename="fix-breaks">
                <xsl:with-paramname="text">
                    <xsl:value-ofselect="substring-after($text,'&#13;&#10;')"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-ofselect="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

多行文本需要為html輸出進行修復,因為CRLF不能理解,必須用<br/>替換。 獲取任務路徑 參見文件TDLSS 9。xsl表示完整示例。 隱藏,復制Code

<xsl:templatename="get_Task_Ancestors">
    <xsl:iftest="count(ancestor::TASK)>0">
        <xsl:for-eachselect="(ancestor::TASK)">
            <xsl:value-ofselect="@TITLE"/>
            <xsl:text> - </xsl:text>
        </xsl:for-each>
    </xsl:if>
</xsl:template>

此模板僅在任務嵌套(樹形視圖)時有效。它列出了從根開始的父節點的標題。 顯示任務嵌套 TDLSS10看到文件。xsl表示完整示例。 在html中,通過簡單的嵌套列表,列表是顯示縮進的自然方式。 隱藏,復制Code

<xsl:templatematch="/TODOLIST">
    <xsl:elementname="html">
        <xsl:elementname="head">
            <xsl:elementname="title">
                <xsl:value-ofselect="@PROJECTNAME"/>
            </xsl:element>
        </xsl:element>
        <xsl:elementname="body">
            . . .
            <xsl:elementname="ul">
                <xsl:apply-templatesselect="TASK"/>
            </xsl:element>
        </xsl:element>
    </xsl:element>
</xsl:template>

<xsl:templatematch="TASK">
    <xsl:elementname="li">
        <xsl:text>Title: </xsl:text>
        <xsl:value-ofselect="@TITLE"/>
        <xsl:elementname="br"/>
    </xsl:element>
    <xsl:elementname="ul">
        <xsl:apply-templatesselect="TASK"/>
    </xsl:element>
</xsl:template>

只需添加& lt; ul>和& lt; li>在遍歷樹的代碼中的正確位置。 使用XML文檔匹配模板 TDLSS11看到文件。xsl和TDLSS12。xsl表示完整的示例。 通常,我們從根匹配模板開始,如示例文件TDLSS11.xsl中所示。 隱藏,復制Code

<xsl:templatematch="/TODOLIST">
    <xsl:elementname="html">
        <xsl:elementname="head">
            <xsl:elementname="title">
                <xsl:value-ofselect="@PROJECTNAME"/>
            </xsl:element>
        </xsl:element>
        <xsl:elementname="body">
            <xsl:text>Root matching template</xsl:text>
            <xsl:elementname="br"/>
            <xsl:elementname="ul">
                <xsl:apply-templatesselect="TASK"/>
            </xsl:element>
        </xsl:element>
    </xsl:element>
</xsl:template>

但有時,需要從文檔匹配模板開始,例如示例文件TDLSS12。xsl做同樣的事情。 隱藏,復制Code

<xsl:templatematch="/">
    <xsl:elementname="html">
        <xsl:elementname="head">
            <xsl:elementname="title">
                <xsl:value-ofselect="@PROJECTNAME"/>
            </xsl:element>
        </xsl:element>
        <xsl:elementname="body">
            <xsl:text>Document matching template</xsl:text>
            <xsl:elementname="br"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:element>
</xsl:template>

<xsl:templatematch="/TODOLIST">
    <xsl:text>Root matching template</xsl:text>
    <xsl:elementname="br"/>
    <xsl:elementname="ul">
        <xsl:apply-templatesselect="TASK"/>
    </xsl:element>
</xsl:template>

您可以看到HTML文檔內容總是在第一個被調用的模板中,而與文檔匹配的模板將根作為子元素調用。 在樣式表中包含HTML標記 當您想格式化輸出時,最好使用html標記。 HTML根 一個html頁面的根結構是這樣的: 隱藏,復制Code

<html>
	<head>
	. . .
	</head>
	<body>
	. . .
	</body>
</html>

由於它只在輸出中出現一次,所以它必須在與根匹配的模板中。 隱藏,復制Code

    <xsl:templatematch="/TODOLIST">
        <xsl:elementname="html">
            <xsl:elementname="head">
                . . .
            </xsl:element>
            <xsl:elementname="body">
                . . .
		        <xsl:apply-templatesselect="TASK"/>
                . . .
		    </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

參見文件TDLSS 3。xsl表示完整示例。 在HTML CRLF CRLF只在html源代碼中使用,在頁面的渲染中不做任何事情。必須使用標簽代替。 隱藏,復制Code

<xsl:elementname="br"/>

並導致 隱藏,復制Code

<br/>

列表 html列表是通過縮進輸出中的任務來顯示任務嵌套的一種簡單方法。這很容易,因為任務的嵌套與列表的嵌套相匹配。 一個html列表是由2部分: 列表分隔符一個列表線分隔符 列表分隔符環繞列表並在每個列表中出現一次。它自然位於處理父任務的模板中。 隱藏,復制Code

<xsl:elementname="ul">
    <xsl:apply-templatesselect="TASK"/>
</xsl:element>

每個列表項顯示一次列表行分隔符。它自然位於處理子任務的模板中。 隱藏,復制Code

<xsl:elementname="li">
    <xsl:text>Title: </xsl:text>
    <xsl:value-ofselect="@TITLE"/>
    <xsl:elementname="br"/>
</xsl:element>

下載

zip包含示例文件: 文件bpsToDoListStyler_Rev018。xsl是todolist文件bpsToDoListStyler_Rev019文章中的示例文件。xsl是后面描述的正確文件。文件HelloWord。示例文件,參見snipset文件HelloTDL99。示例文件,參見snipset 鏈接 ToDoList-一種有效且靈活的保持方式:關於ToDoList軟件的文章。ToDoList的XSL轉換:在這篇文章中,我找到了一個用於ToDoList的示例樣式表。AbstractSpoon軟件ToDoList Wiki:由TDL作者制作的TDL Wiki頁面。w3schools.com:一個教授XML、HTML、XSLT、XPath的網站。 歷史 2015/05/01初稿。2015/05/19添加了一些東西,更新了下載和更正。2015/06/15增加更多素材,更新下載 本文轉載於:http://www.diyabc.com/frontweb/news423.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM