逐步解說:對 XSLT 樣式表進行偵錯
此逐步教學中的步驟示範如何使用 XSLT 偵錯工具。 這些步驟包括檢視變數、設定中斷點及逐步執行程式碼。 該偵錯工具可讓您一次執行一行程式碼。
若要準備進行本逐步解說,請先將兩個樣本檔案複製到本機電腦。 其中一個是樣式表,另一個是我們將用作樣式表輸入的 XML 檔案。 在本逐步解說中,我們使用的樣式表會尋找成本低於平均書籍價格的所有書籍。
注意
該 XSLT 偵錯工具僅可在 Visual Studio 的 Professional 和 Enterprise 版本中使用。
開始偵錯
從 [檔案] 功能表中,選擇 [開啟]>[檔案]。
找到 below-average.xsl 檔案並選擇 [開啟]。
該樣式表即會在 XML 編輯器中開啟。
按一下文件屬性視窗中 [輸入] 欄位上的瀏覽按鈕 (...)。 (如果看不到 [屬性] 視窗,請以滑鼠右鍵按一下編輯器中開啟的檔案上的任意位置,然後選擇 [屬性]。)
找到 books.xml 檔案,然後選擇 [開啟]。
這會設定用於 XSLT 轉換的來源文件檔案。
在 below-average.xsl 的第 12 行上設定一個中斷點。 您可以使用下列多種方式中的其中一種來執行此動作:
按一下第 12 行上的編輯器的頁邊距。
按一下第 12 行上的任何位置,然後按 F9。
以滑鼠右鍵按一下
xsl:if
開始標記,然後選擇 [中斷點]>[插入中斷點]。
在功能表列上,選擇 XML>[啟動 XSLT 偵錯] (或按 Alt+F5)。
偵錯處理程序隨即啟動。
在編輯器中,該偵錯工具位於樣式表的
xsl:if
元素上。 另一個名為 below-average.xml 的檔案會在編輯器中開啟;這是在處理輸入檔 books.xml 中的每個節點時將填入的輸出檔。Autos、Locals 和 Watch 1 視窗會顯示在 Visual Studio 視窗的底部。 Locals 視窗會顯示所有區域變數及其目前的值。 其中包括在樣式表中定義的變數,及偵錯工具用來追蹤目前內容中之節點的變數。
監看視窗
我們會在 Watch 1 視窗中新增兩個變數,以便我們可以在處理輸入檔時檢查它們的值。 (如果您想要監看的變數已在那裡,您也可以使用 Locals 視窗來檢查其值。)
從 [偵錯] 功能表中,選擇 Windows>Watch>Watch 1。
Watch 1 視窗會變成可見的。
在 [名稱] 欄位中輸入
$bookAverage
,然後按 Enter。$bookAverage
變數的值會顯示在 [值] 欄位中。在下一行中,在 [名稱] 欄位中輸入
self::node()
,然後按 Enter。self::node()
是一種 XPath 運算式,可評估目前的內容節點。self::node()
XPath 運算式的值為第一個書籍節點。 它會隨著轉換的進行而變更。展開
self::node()
節點,然後展開其值為price
的節點。您可以看到目前書籍節點的書籍價格值,並將其與
$bookAverage
值進行比較。 因為書籍價格低於平均值,所以當您繼續偵錯處理程序時xsl:if
條件應該會成功。
逐步執行程式碼
按 F5 繼續。
因為第一個書籍節點滿足
xsl:if
條件,所以會將該書籍節點加入 below-average.xml 輸出檔。 偵錯工具繼續執行,直到其再次定位於樣式表的xsl:if
項目上為止。 偵錯工具現在定位於 books.xml 檔的第二個書籍節點上。在 Watch 1 視窗中,
self::node()
值會變更為第二個書籍節點。 藉由檢查價格項目的值,您可以確定價格高於平均值,因此xsl:if
條件應該會失敗。按 F5 繼續。
因為第二個書籍節點與
xsl:if
條件不符,所以不會將該書籍節點加入 below-average.xml 輸出檔。 偵錯工具繼續執行,直到其再次定位於樣式表的xsl:if
項目上為止。 偵錯工具現在定位於 books.xml 檔的第三個book
節點上。在 Watch 1 視窗中,
self::node()
值會變更為第三個書籍節點。 藉由檢查price
元素的值,您可以確定價格低於平均值。xsl:if
條件應該會成功。按 F5 繼續。
因為已滿足
xsl:if
條件,所以會將第三本書籍加入 below-average.xml 輸出檔。 當處理過 XML 文件中的所有書籍後,偵錯工具會停止。
範例檔案
逐步教學會使用下列兩個檔案。
below-average.xsl
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8"/>
<xsl:template match="/">
<xsl:variable name="bookCount" select="count(/bookstore/book)"/>
<xsl:variable name="bookTotal" select="sum(/bookstore/book/price)"/>
<xsl:variable name="bookAverage" select="$bookTotal div $bookCount"/>
<books>
<!--Books That Cost Below Average-->
<xsl:for-each select="/bookstore/book">
<xsl:if test="price < $bookAverage">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</books>
</xsl:template>
</xsl:stylesheet>
books.xml
<?xml version='1.0'?>
<!-- This file represents a fragment of a book store inventory database -->
<bookstore>
<book genre="autobiography" publicationdate="1981" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>