如何根据Saxon不适合我的方式生成结果文档?

时间:2015-10-12 03:46:46

标签: xml validation xslt dtd

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

以下是源代码:



StringLength

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)>



​
&#13;
<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml"
		doctype-system="customers.dtd"
		encoding="UTF-8"
		indent="yes" />
		
<xsl:template match="/">
   <xsl:comment>
	Author: Paulina Crawford
	Date: 10/10/2015
	</xsl:comment>
	
<xsl:element name="customers">
  <xsl:apply-templates
  	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:value-of select="@orderid/id" />
	  <xsl:value-of select="@qty" />
	  <xsl:value-of select="@date" />
	  <xsl:value-of select="@amount" />
	</xsl:element>
<xsl:value-of select="custid" />
</xsl:element>
 </xsl:template>
</xsl:stylesheet>​
&#13;
&#13;
&#13;

如果有人能提供任何帮助,我将永远感激......

更新的代码:

&#13;
&#13;
<?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>​
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

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

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

您引用属性@date和@amount,但这些是源中的元素,而不是属性。您还可以引用@ orderid / id,它在任何XML文档中都不存在:属性节点没有子元素。

最后,您的所有代码都在“root”模板中(使用match =“/”),但是大多数路径表达式只有在上下文项是“order”元素时才有意义。

坦率地说,我认为你是以错误的方式进行这项任务。你说你已经工作了好几天了。我怀疑你花了这么多时间试图让代码正常工作,而你应该把时间花在舒适的椅子上看书。在阅读了任何合理的XSLT教科书两天后,理想情况下做一些有用的例子,你可以在一小时内编写这个样式表。