2015-10-13 3 views
0

Я работаю над своим первым XSL-файлом все выходные и понедельник, но не только что-то не так с ним, что не позволяет мне преобразовать его в XML-документ на основе DTD, но он также имеет ошибки, которые я не могу представить выяснить. Мне удалось исправить некоторые очевидные проблемы, но все задание меня спрашивает:Почему мой XSL не может быть преобразован в XML-документ и как его заставить проверить?

Добавить элемент «клиенты» в корневой шаблон, применить шаблон заказа и добавить узел атрибута id, используя custid как value ... Затем создайте элемент order с атрибутом идентификатора заказа, взятым из источника, а затем добавьте другие элементы и атрибуты со значениями, взятыми из источника. Возможно, у меня так много проблем, потому что все примеры, которые я читал, использовали теги HTML внутри документа XSL, но этот формат должен быть XML.

Вот мой код и источник:

<!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="ISO-8859-1" ?> 
 

 
<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="ISO-8859-1" 
 
\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:element> 
 
</xsl:template> 
 
<xsl:apply-templates select="order"> 
 
<xsl:element name="customer"> 
 
\t <xsl:attribute name="id"> 
 
\t <xsl:value-of select="@custid" /> 
 
\t <xsl:element name="order"> 
 
\t <xsl:attribute name="orderid"> 
 
\t <xsl:value-of select="@id" /> 
 
\t <xsl:element name="qty"> 
 
\t <xsl:value-of select="@qty" /> 
 
\t <xsl:element name="date"> 
 
\t <xsl:value-of select="date" /> 
 
\t <xsl:element name="amount"> 
 
\t <xsl:value-of select="amount" /> 
 
\t </xsl:template> 
 
</xsl:stylesheet>​
<?xml version="1.0" encoding="ISO-8859-1" ?> 
 

 
<?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>​

Ошибка я получаю продолжает говорить, что я должен «прекратить действие или тег элемента», поскольку он является дубликатом или что-то. .. Если кто-то может помочь, он будет очень признателен ... Спасибо.

ответ

1

XSLT должен быть хорошо сформированным XML, и это означает, что для каждого вступительного тега вы должны иметь закрывающий тег, но вам не хватает многого. Например, при создании qty элемента, вы делаете это ...

<xsl:element name="qty"> 
     <xsl:value-of select="@qty" /> 

Но нет закрытия </xsl:element> тега виден. Если вы попытаетесь отложить свой XSLT, с закрытыми тегами, выстроившимися с открытыми тегами, то это будет более очевидно.

Ваш XSLT должен, вероятно, выглядеть следующим образом

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" doctype-system="customers.dtd" encoding="ISO-8859-1" 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:template> 

<xsl:template match="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:attribute> 

      <xsl:element name="qty"> 
       <xsl:value-of select="@qty" /> 
      </xsl:element> 

      <xsl:element name="date"> 
       <xsl:value-of select="date" /> 
      </xsl:element> 

      <xsl:element name="amount"> 
        <xsl:value-of select="amount" /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

Обратите внимание, что вы на самом деле не нужно xsl:element здесь, чтобы создать имена элементов. Просто напишите элемент, который вы хотите выводить напрямую. Попробуйте это тоже

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

<xsl:template match="/"> 
    <xsl:comment> 
    Author: Paulina Crawford 
    Date: 10/10/2015 
    </xsl:comment> 

    <customers> 
     <xsl:apply-templates select="orders/order"> 
      <xsl:sort select="custid" /> 
     </xsl:apply-templates> 
    </customers> 
</xsl:template> 

<xsl:template match="order"> 
    <customer id="{@custid}"> 
     <order orderid="{@id}"> 
      <qty> 
       <xsl:value-of select="@qty" /> 
      </qty> 
      <date> 
       <xsl:value-of select="date" /> 
      </date> 
      <amount> 
       <xsl:value-of select="amount" /> 
      </amount> 
     </order> 
    </customer> 
</xsl:template> 
</xsl:stylesheet> 

Обратите внимание на использование Attribute Value Templates в создании некоторых из атрибутов. В фигурных скобках указано выражение, которое должно быть оценено, а не выводиться буквально.

+0

Большое вам спасибо, теперь это имеет смысл! – Pau808