0

我的 XML 课程中的作业有问题。我们被指派创建一个 XSL 文档并格式化一些预先存在的 XML 文件。出于某种原因,我无法查看我的 XML 文件,我认为这与 XSL 中的错误有关,但我不确定。

Here's the XSL File (flowers.xsl)

<?xml version="1.0" encoding="UTF-8" ?>
<!--
   New Perspectives on XML
   Tutorial 8
   Case Problem 2

   WebFlowers XSLT Style Sheet

   Filename:         flowers.xsl
   Supporting Files: customers.xml, flowers.css, items.xml
-->

<xsl:stylesheet version='1.0' xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable
name="items"
select="items.xml">
</xsl:variable>

<xsl:variable
name="customers"
select="customers.xml">
</xsl:variable>

<key id=ID name=itemID>
</key>

<key id=ID name=custID>
</key>

<key id=date name=date>
</key>

<xsl:template match="/">
   <html>
   <head>
      <title>Flower Orders</title>
      <link href="flowers.css" rel="stylesheet" type="text/css" />
   </head>
   <body>
      <h1>Flower Orders</h1>
      <table>
      <tr>
         <th>Date</th>
         <th>Customer</th>
         <th>Item</th>
         <th>Price</th>
         <th>Qty</th>
         <th>Total</th>
      </tr>
    <xsl:key name="order-by-date" match="date" use="key(date)" />
<xsl:template match="order">
    <xsl:for-each select="date[count(. | key('order-by-date', date)[1]) = 1]">
        <xsl:sort select="date" />
            </xsl:for-each>
</xsl:template>

      <tr>
         <td colspan="4" class="grand">Grand Total</td>
         <td class="grand"> sum(qty)</td>
         <td class="grand">
    <xsl:template match="totalCost" list="key(order)"
        </td>
      </tr>
      </table>
   </body>
   </html>
</xsl:template>

<xsl:template match="order">
<xsl:variable
    name="cID"
    select="customer">

</xsl:variable>

<xsl:variable
    name="iID"
    select="item">

</xsl:variable>

<xsl:variable
    name="qtyValue"
    select="qty">

</xsl:variable>


   <tr>
      <!-- Display order date -->
    <xsl:if test="position() == 1">
    <td rowspan="rows" class="date">
        date
        rows=count(<xsl:value-of select="current()"/>)
    </td>
    </xsl:if>


      <!-- Display customer information -->
    <xsl:for-each select="customers">
    <td>
    <xsl:key name="order-by-name" match="key(custID)\name" use="cID" /><br/>
    <xsl:key name="order-by-city" match="key(custID)\city" use="cID" /> <br/>,
    <xsl:key name="order-by-state" match="key(custID)\state" use="cID" /> &#160;&#160;
    <xsl:key name="order-by-zip" match="key(custID)\zip" use="cID" />
    </td>


    </xsl:for-each>

      <!-- Display item name and price-->

        <xsl:for-each select="items">
        <td>
        <xsl:key name="order-by-name" match="key(itemID)\name" use="iID" />
        </td>
        <td class="num">
        <xsl:key name="order-by-price" match="key(itemID)\price" use="iID" />
        </td>


    </xsl:for-each>


      <!-- Display item quantity -->
      <td class="num"><xsl:value-of select="@qty" /></td>  

      <!-- Display cost of items ordered -->

    <xsl:for-each select="items">

        <td class="num">
        item cost
        </td>


    </xsl:for-each>

   </tr>

   <!-- Display subtotals -->
   <xsl:if test="position()=last()">
      <tr><td colspan="5"><hr /></td></tr>
      <tr>
         <td colspan="3" class="sub">Subtotal</td>
         <td class="sub">sum(current(key(date)), current(key(qty)))</td>
         <td class="sub">
    <xsl:template match="node(key(date))" mode="rows">
    </xsl:template>
        </td>
      </tr>
      <tr><td colspan="6"><hr /></td></tr>
   </xsl:if>

</xsl:template>

<xsl:template match="/">
<xsl:param name="list"/>
<xsl:param name="total" select="0"/>

<xsl:choose>
  <xsl:when test="$list == NULL">
    <xsl:variable
name="first"
select="list">
</xsl:variable>

<xsl:variable
name="iID"
select="item">
</xsl:variable>

<xsl:variable
name="itemQty"
select="qty">
</xsl:variable>


</xsl:when>
<xsl:otherwise>
 <xsl:value-of select='format-number (total, "$#,#00.00)' />
</xsl:otherwise>
</xsl:choose>

 <xsl:for-each select="items">
    <xsl:variable
    name="itemPrice"
    select="key(itemID, iID)">
    </xsl:variable>


    </xsl:for-each>
<xsl:call-template name="totalCost">
    select= ($itemQty * $itemPrice + $total)
</xsl:call-template>
</xsl:stylesheet>

这是此样式表附加到的 XML 文件之一:

<?xml version="1.0" encoding="UTF-8" ?>
<!--
   New Perspectives on XML
   Tutorial 8
   Case Problem 2

   WebFlowers Items Data

   Filename:         items.xml
   Supporting Files: 
-->
<?xml-stylesheet type="text/xsl" href="flowers.xsl"?>
<items>
   <item id="F101">
      <name>Large Flower Vase Arrangement</name>
      <price>74.99</price>
   </item>
   <item id="F102">
      <name>Flowers Galore: Orchids and Roses</name>
      <price>89.99</price>
   </item>
   <item id="F103">
      <name>Bear with Dozen Roses</name>
      <price>82.99</price>
   </item>
   <item id="F104">
      <name>Medium Ivy Flower Bowl</name>
      <price>49.99</price>
   </item>
   <item id="F105">
      <name>Flower Bowl</name>
      <price>54.99</price>
   </item>
   <item id="F106">
      <name>One Dozen Red Roses</name>
      <price>64.99</price>
   </item>
   <item id="F107">
      <name>One Dozen White Roses</name>
      <price>62.99</price>
   </item>
   <item id="F108">
      <name>One Dozen Pink Roses</name>
      <price>62.99</price>
   </item>
   <item id="F109">
      <name>Fragrant Garden Basket</name>
      <price>49.99</price>
   </item>
   <item id="F110">
      <name>Classic Vase</name>
      <price>64.99</price>
   </item>
   <item id="F111">
      <name>White Flower Elegance</name>
      <price>84.99</price>
   </item>
   <item id="F112">
      <name>Flowers to Go</name>
      <price>44.99</price>
   </item>
   <item id="F113">
      <name>Bright Autumn Flowers</name>
      <price>49.99</price>
   </item>
   <item id="F114">
      <name>Pedestal Bowl</name>
      <price>49.99</price>
   </item>
   <item id="F115">
      <name>Summer Vase</name>
      <price>69.99</price>
   </item>
   <item id="F116">
      <name>Dizzy with Daisies</name>
      <price>44.99</price>
   </item>
   <item id="F117">
      <name>Fragrant Pink Lillies</name>
      <price>72.99</price>
   </item>
   <item id="F118">
      <name>Medley Basket</name>
      <price>54.99</price>
   </item>
   <item id="F119">
      <name>Romantic Vase</name>
      <price>67.99</price>
   </item>
   <item id="F120">
      <name>Spring Fling Flowers</name>
      <price>59.99</price>
   </item>
   <item id="F121">
      <name>Fragrant Lillies</name>
      <price>74.99</price>
   </item>
   <item id="F122">
      <name>Spring Flower Basket</name>
      <price>54.99</price>
   </item>
   <item id="F123">
      <name>Enchanted Roses</name>
      <price>59.99</price>
   </item>
   <item id="F124">
      <name>Large Flower Vase Arrangement</name>
      <price>159.99</price>
   </item>
   <item id="F125">
      <name>Spring Blooms</name>
      <price>54.99</price>
   </item>
   <item id="F126">
      <name>White Bear Bouquet</name>
      <price>49.99</price>
   </item>
   <item id="F127">
      <name>Golden Basket</name>
      <price>69.99</price>
   </item>
   <item id="F128">
      <name>Regal Iris Vase</name>
      <price>57.99</price>
   </item>
   <item id="F129">
      <name>Flowers of Europe</name>
      <price>69.99</price>
   </item>
   <item id="F130">
      <name>Fragrant Blooms</name>
      <price>59.99</price>
   </item>
   <item id="F131">
      <name>Pretty in Pink</name>
      <price>49.99</price>
   </item>
   <item id="F132">
      <name>Spray of Roses</name>
      <price>69.99</price>
   </item>
   <item id="F133">
      <name>Yellow Sunflowers</name>
      <price>59.99</price>
   </item>
   <item id="F134">
      <name>Bright Spring Vase</name>
      <price>43.99</price>
   </item>
   <item id="F135">
      <name>Yellow Daisy Vase</name>
      <price>49.99</price>
   </item>
   <item id="F136">
      <name>Spring Compote</name>
      <price>109.99</price>
   </item>
   <item id="F137">
      <name>Country Garden Basket</name>
      <price>59.99</price>
   </item>
   <item id="F138">
      <name>Sunflower Basket</name>
      <price>56.99</price>
   </item>
   <item id="F139">
      <name>Medium Ginger Jar</name>
      <price>44.99</price>
   </item>
   <item id="F140">
      <name>Pleasant Basket</name>
      <price>99.99</price>
   </item>
</items>

任何帮助都将不胜感激,无论是参考正确的方法还是只是指出错误。先感谢您!

4

3 回答 3

2

通过验证器运行您的 XSLT/XML以获得更多信息,但从我最初的运行来看,第一个问题是关于key标签的。确保将属性值括在引号中,如下所示:

<key id="ID" name="itemID" />

<key id="ID" name="custID" />

<key id="date" name="date" />

XML 验证器:http: //bit.ly/1nl0BFa

于 2014-02-09T04:37:10.890 回答
1

引用 xml 文档的行应该是

<xsl:variable name="items" select="document(items.xml)">

代替

<xsl:variable name="items" select="items.xml">

如果您将您的 xml 文件保存在其他位置,在这种情况下,您需要指定完整路径,例如:

<xsl:variable name='ref_file' select="document('C:/../../Desktop/ref.xml')"/>

请注意,您应该使用正斜杠

/

除此之外,您的代码还有一些错误,因此请在进一步移动之前查看一下。

于 2014-02-09T05:00:14.227 回答
1

我认为你需要仔细研究你编写代码和解决问题的方法,当它不起作用时。

您在这里的错误是非常基本的。这不是问题,我们在开始时都会犯基本错误。好程序员和坏程序员之间的区别在于他们发现错误原因并修复错误的效率。

如果您使用正确的工具,很多此类错误都不会发生;就像创建文档时的拼写检查器一样,理解 XSLT 的开发工具会在您创建错误时标记您的错误,并为您提供自动内容完成功能,从而在您键入时有效地纠正基本错误。因为我在 Mac 上,所以我使用 oXygen,但还有其他可用的工具。

此外,如果您在开始编写代码之前花几个小时阅读该语言的良好介绍,并研究其示例,那么很多错误都不会发生。在我的时间里,我可能已经用 20 种不同的编程语言编写过代码,如果不先花一个晚上阅读关于该主题的书,我永远不会用新语言编写代码。

最后,诊断很重要!我总是想知道那些发布问题的人说某事不起作用,而没有实际说明出了什么问题(例如错误消息)。也许您没有看到错误消息是因为您使用了不合适的环境(例如,在浏览器中运行 XSLT 而没有先在其他地方对其进行测试)。也许错误信息就在那里,但你忽略它们是因为你不理解它们(你不理解它们是因为你没有花时间在开始之前通过阅读语言来学习概念和词汇)。或者,也许您只是没有从证据中学习解决问题的方法,其中错误消息是最重要的部分。

一个优点是你准备好寻求帮助。然而,我建议在这个阶段向你的老师和同学寻求帮助比在互联网上寻求帮助更有成效。

于 2014-02-09T09:41:06.563 回答