2015-10-12 37 views
0

我一直在这个项目上工作几天。该任务让我创建一个基于XML文件并基于DTD文件的XSL样式表。一旦我最终获得了XLT文件来验证(我希望我做的一切都正确),我试了几个小时才用XML生成结果文档,但没有运气。我下载了教科书中推荐的Saxon,但即使我提取了文件等,但仍然收到错误消息。有没有更简单的方法来生成结果XML文档?我也需要确保验证。当Saxon不适合我时,如何生成结果文档?

这里是源代码:

DTD file 
 

 

 
<!ELEMENT customers (customer)*> 
 

 
<!ELEMENT customer (order)> 
 
<!ATTLIST customer id CDATA #IMPLIED> 
 

 
<!ELEMENT order (qty, date, amount)> 
 
<!ATTLIST order orderid CDATA #IMPLIED> 
 

 
<!ELEMENT qty (#PCDATA)> 
 
<!ELEMENT date (#PCDATA)> 
 
<!ELEMENT amount (#PCDATA)> 
 

 

 

 
​
<?xml version="1.0" encoding="UTF-8" ?> 
 

 
<xsl:stylesheet version="1.0" 
 
\t xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
 
\t <xsl:output method="xml" 
 
\t \t doctype-system="customers.dtd" 
 
\t \t encoding="UTF-8" 
 
\t \t indent="yes" /> 
 
\t \t 
 
<xsl:template match="/"> 
 
    <xsl:comment> 
 
\t Author: Paulina Crawford 
 
\t Date: 10/10/2015 
 
\t </xsl:comment> 
 
\t 
 
<xsl:element name="customers"> 
 
    <xsl:apply-templates 
 
    \t select="orders/order"> 
 
     <xsl:sort select="custid" /> 
 
    </xsl:apply-templates> 
 
</xsl:element> 
 
<xsl:apply-templates select="order" /> 
 
<xsl:element name="customer"> 
 
\t <xsl:attribute name="id"> 
 
\t <xsl:value-of select="custid" /> 
 
\t </xsl:attribute> 
 
\t <xsl:element name="order"> 
 
\t <xsl:value-of select="@orderid/id" /> 
 
\t <xsl:value-of select="@qty" /> 
 
\t <xsl:value-of select="@date" /> 
 
\t <xsl:value-of select="@amount" /> 
 
\t </xsl:element> 
 
<xsl:value-of select="custid" /> 
 
</xsl:element> 
 
</xsl:template> 
 
</xsl:stylesheet>​
<?xml version="1.0" encoding="UTF-8" ?> 
 

 

 
<?xml-stylesheet type="text/xsl" href="clist.xsl" ?> 
 

 
<orders> 
 
    <order id="OR3124" qty="1" custid="CUST204"> 
 
     <date>5/1/2017</date> 
 
     <amount>$108.24</amount> 
 
    </order> 
 
    <order id="OR3125" qty="2" custid="CUST117"> 
 
     <date>5/1/2017</date> 
 
     <amount>$78.21</amount> 
 
    </order> 
 
    <order id="OR3126" qty="1" custid="CUST311"> 
 
     <date>5/1/2017</date> 
 
     <amount>$45.93</amount> 
 
    </order> 
 
    <order id="OR3127" qty="4" custid="CUST091"> 
 
     <date>5/2/2017</date> 
 
     <amount>$68.21</amount> 
 
    </order> 
 
    <order id="OR3128" qty="1" custid="CUST137"> 
 
     <date>5/2/2017</date> 
 
     <amount>$117.24</amount> 
 
    </order> 
 
    <order id="OR3129" qty="1" custid="CUST128"> 
 
     <date>5/3/2017</date> 
 
     <amount>$75.68</amount> 
 
    </order> 
 
    <order id="OR3130" qty="2" custid="CUST083"> 
 
     <date>5/3/2017</date> 
 
     <amount>$58.93</amount> 
 
    </order> 
 
    <order id="OR3131" qty="1" custid="CUST304"> 
 
     <date>5/3/2017</date> 
 
     <amount>$112.25</amount> 
 
    </order> 
 
</orders>​

如果任何人都可以请提供任何帮助,我将永远感激......

更新的代码:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
 

 
<xsl:stylesheet version="1.0" 
 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
 
<xsl:output method="xml" 
 
\t doctype-system="customers.dtd" 
 
\t encoding="ISO-8859-1" 
 
\t indent="yes" /> 
 
\t 
 
<xsl:template match="/"> 
 

 
    <xsl:element name="customers"> 
 
     <xsl:apply-templates 
 
    \t  select="orders/order"> 
 
      <xsl:sort select="custid" /> 
 
      </xsl:apply-templates> 
 
      </xsl:element> 
 

 
      <xsl:apply-templates select="order"> 
 
      <xsl:element name="customer"> 
 
     <xsl:attribute name="id"> 
 
      <xsl:value-of select="@custid" /> 
 
      </xsl:attribute> 
 
     <xsl:element name="order"> 
 
     <xsl:attribute name="orderid"> 
 
      <xsl:value-of select="@id" /> 
 
     <xsl:element name="qty"> 
 
      <xsl:value-of select="@qty" /> 
 
     <xsl:element name="date"> 
 
     <xsl:value-of select="date" /> 
 
    <xsl:element name="amount"> 
 
     <xsl:value-of select="amount" /> 
 
    </xsl:element> 
 
     <xsl:value-of select="custid" /> 
 
    </xsl:templates> 
 
    </xsl:stylesheet> 
 

+0

如果您不告诉我们错误消息是什么,告诉我们您收到错误消息是毫无意义的。此外,您提交的样式表代码中没有调用xsl:result-document。所以我们完全不知道你做错了什么。 –

回答

1

正如我的评论中所提到的,我们无法看到您对xsl:result-document的调用错误,而没有看到该代码或看到错误消息。以下是您向我们显示的代码中存在错误的一些内容:

您将(两次)作为元素名称引用custid,但没有称为custid的元素。也许你打算使用该名称的属性,这将是@custid。

您引用属性@date和@amount,但这些是您的源中的元素,而不是属性。您还可以参考@ orderid/id,它不能在任何XML文档中存在:属性节点没有元素作为子元素。最后,所有的代码都在“根”模板中(匹配=“/”),但是如果上下文项是“order”元素,那么大多数路径表达式只有意义。

坦率地说,我认为你会以错误的方式去完成这项任务。你说你已经做了好几天了。我怀疑你这段时间一直在努力让代码工作,而你应该花时间坐在舒适的椅子上阅读一本书。在阅读任何合理的XSLT教科书两天后,理想情况下执行一些工作示例,您在一小时内编写此样式表就会遇到一些麻烦。

+0

谢谢你的诚实话语。我真的很感激我知道我的代码有什么问题。我其实在XML和XSL方面非常新,但我接受了你的建议。老实说,尽管我有HTML背景,但我仍然无法理解它。我将当前的代码添加到OP,并且我没有收到错误消息,这就是为什么我认为它已经完成了。该作业还告诉我按照custid排序... – Pau808

+0

与许多现代语言相比,XSLT不擅长静态检测错误。很多时候,如果你的代码错了,你只会得到错误的输出。这实际上是原始设计理念的一部分,与HTML共享,并被认为适用于浏览器世界:垃圾进入,出了什么东西。静态错误检测在后来的XSLT版本中得到了改进,如果您使用支持架构的XSLT,但仍然远非完美。 –