演练:调试 XSLT 样式表
此演练中的步骤演示如何使用 XSLT 调试程序。 步骤包括查看变量、设置断点和逐行执行代码。 样式表查找所有价格低于平均书价的书籍。
准备此次演练
关闭任何打开的解决方案。
将两个示例文件复制到本地计算机上。
开始调试
要开始调试,请执行下列操作:
从“文件”菜单中指向“打开”,然后单击“文件”。
找到 belowAvg.xsl 文件并单击“打开”。
该样式表将在“XML 编辑器”中打开。
在文档属性窗口的“输入”字段上单击“浏览”按钮 (...)。
找到 books.xml 文件并单击“打开”。
此时将设置用于 XSLT 转换的源文档文件。
右击
xsl:if
开始标记,指向“断点”,再单击“插入断点”。在“XML 编辑器”的工具栏上单击“调试 XSL”****按钮。
此时将开始调试过程,并打开几个新窗口供调试程序使用。
有两个窗口显示输入文档和样式表。 调试器使用这些窗口来显示当前的执行状态。 调试器位于样式表的 xsl:if
元素上和 books.xml 文件中的第一个 book 节点上。
“局部变量”窗口显示所有局部变量及其当前值。 其中包括样式表中定义的变量,也包括调试程序在跟踪上下文中的当前节点时使用的变量。
“XSL 输出”窗口显示 XSL 转换的输出。 此窗口独立于“Visual Studio 输出”窗口。
“监视”窗口
要使用“监视”窗口,请执行下列操作:
在“调试”菜单中指向“窗口”****,再指向“监视”,然后单击“监视 1”。
此时出现“监视 1”窗口。
在“名称”字段中键入
$bookAverage
,再按 ENTER 键。$bookAverage
变量的值将显示在窗口中。在“名称”****字段中键入
self::node()
,再按 ENTER 键。self::node()
是一个计算结果为当前上下文节点的 XPath 表达式。self::node()
XPath 表达式的值是第一个 book 节点。此值随着转换的进度而更改。展开
self::node()
节点,然后展开price
节点。这样可以查看书价的值,并且可以很容易将其与
$bookAverage
值进行比较。 因为书价低于平均值,所以,xsl:if
条件应继续。
逐行执行代码
调试程序允许您一次执行一行代码。
要逐行执行代码,请执行下列操作:
按**“F5”**键继续。
因为第一个 book 节点满足
xsl:if
条件,所以,该 book 节点将添加到“XSL 输出”窗口。 调试器继续执行,直到它再次位于样式表中的xsl:if
元素上。 调试器此时位于 books.xml 文件中的第二个 book 节点上。在 Watch1 窗口中,
self::node()
值变为第二个 book 节点。通过检查 price 元素的值,可以确定价格高于平均值,所以,xsl:if
条件应失败。按 F5 键继续。
因为第二个 book 节点未满足
xsl:if
条件,所以不会将此 book 节点添加到“XSL 输出”窗口。 调试器继续执行,直到它再次位于样式表中的xsl:if
元素上。 调试器此时位于 books.xml 文件中的第三个book
节点上。在 Watch1 窗口中,
self::node()
值变为第三个 book 节点。 通过检查price
元素的值,您可以确定此价格低于平均价格,因此xsl:if
条件应成立。按 F5 键继续。
因为满足
xsl:if
条件,所以,第三个 book 节点将添加到“XSL 输出”窗口。 XML 文档中的所有 book 节点均已处理,调试程序停止。
示例文件
下列两个文件供该演练使用。
belowAvg.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>