XSLT的问题

时间:2014-02-09 04:10:05

标签: xml xslt xsl-stylesheet

我在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>

真的很感激任何帮助,无论是参考正确的方法还是指出错误。提前谢谢!

3 个答案:

答案 0 :(得分:2)

通过验证程序运行您的XSLT / XML以获取有关此内容的更多信息,但从我的初始运行开始,第一个问题出现在key标记上。确保将属性值括在引号中,如下所示:

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

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

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

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

答案 1 :(得分:1)

引用xml文档的行应该是

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

而不是

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

如果您将ur xml文件保存在其他位置的某个位置,那么您需要指定完整路径Ex:

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

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

  

/

除此之外,您的代码还有更多错误,因此请在进一步了解之前先了解一下。

答案 2 :(得分:1)

我认为你需要仔细研究编写代码和解决问题的方法。

这里的错误非常基本。这不是问题,我们在开始时都会犯下基本错误。优秀的程序员和糟糕的程序员之间的区别在于他们在发现错误原因和修复错误方面的效率。

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

此外,如果您在开始编写代码之前花了几个小时阅读对该语言的良好介绍并完成其示例,那么很多错误都不会发生。我可能在我的时代用20种不同的编程语言编写,如果没有晚上读一本关于这个主题的书,我绝不会用新的语言编写代码。

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

唯一的一点是,你准备寻求帮助。不过,我建议在这个阶段向你的老师和同学寻求帮助比要求上网更有效率。