Не удается извлечь данные из вложенного xml-документа и заполнить таблицу стилей xsl, чтобы получить веб-страницу html

#html #css #xml #xslt

#HTML #CSS #xml #xslt

Вопрос:

Это общее описание, я застрял в пункте 5. Я попробовал с for-each, создание идентификатора и применение шаблона, похоже, не сработали для меня, не зная, где я упускаю. Мне просто нужно выполнить 5-й пункт, нужно заполнить пункт№, описание и количество, я не знаю, как это сделать, так как это своего рода вложенный xml.Может кто-нибудь, пожалуйста, помочь с этим, я новичок в веб-технологиях, пытаюсь учиться. Прикрепляю свой код ниже.

Перейдите в файл camping.xsl в текстовом редакторе и начните создавать таблицу стилей XSLT. Джон хочет, чтобы отчет включал следующие функции:

  1. Название магазина в качестве основного заголовка.
  2. Таблица идентификаторов клиентов, содержащая имя, адрес и идентификатор каждого клиента, с клиентами, перечисленными в алфавитном порядке по имени клиента.
  3. Таблицы заказов следуют за каждой таблицей идентификаторов клиентов с информацией о заказе для этого клиента; таблицы заказов перечислены в порядке убывания по идентификатору заказа.
  4. Каждая таблица заказов должна содержать дату заказа и идентификатор заказа.
  5. В каждой таблице заказов должны быть перечислены товары, приобретенные вместе с товарами, приобретенными в наибольших количествах, перечисленных первыми. Если два продукта имеют одинаковое количество заказанных товаров, продукты должны быть расположены в алфавитном порядке по идентификатору товара.

это тот самый campingtxt.xml файл

 lt;?xml version="1.0" encoding="UTF-8"?gt; lt;?xml-stylesheet type="html" href="campingtxt.html"?gt; lt;customers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"gt;  lt;?xml-stylesheet type="html" version="2.0" href="campingtxt.xsl"?gt;   lt;customer cid="c5781"gt;  lt;namegt;Hardy, Joanlt;/namegt;  lt;streetgt;105 Terrace Rd.lt;/streetgt;  lt;citygt;Duncanlt;/citygt;  lt;stategt;NElt;/stategt;  lt;zipgt;68634lt;/zipgt;  lt;ordersgt;  lt;order oid="51170"gt;  lt;dategt;8/2/2017lt;/dategt;  lt;item iid="p5148"gt;  lt;descriptiongt;Self-Inflating Padlt;/descriptiongt;  lt;qtygt;2lt;/qtygt;  lt;/itemgt;  lt;item iid="sb2818"gt;  lt;descriptiongt;Down Sleeping Baglt;/descriptiongt;  lt;qtygt;2lt;/qtygt;  lt;/itemgt;  lt;item iid="t7815"gt;  lt;descriptiongt;2 Person Tentlt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;/ordergt;  lt;order oid="52811"gt;  lt;dategt;8/11/2017lt;/dategt;  lt;item iid="led7331"gt;  lt;descriptiongt;LED Rechargeable Lanternlt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="wp0312"gt;  lt;descriptiongt;Water Purifierlt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;/ordergt;  lt;/ordersgt;  lt;/customergt;  lt;customer cid="c5391"gt;  lt;namegt;Evans, Terrylt;/namegt;  lt;streetgt;641 Greenway Blvd.lt;/streetgt;  lt;citygt;Mount Hopelt;/citygt;  lt;stategt;OHlt;/stategt;  lt;zipgt;44660lt;/zipgt;  lt;ordersgt;  lt;order oid="52517"gt;  lt;dategt;8/1/2017lt;/dategt;  lt;item iid="wb7133"gt;  lt;descriptiongt;Insulated Water Bottlelt;/descriptiongt;  lt;qtygt;2lt;/qtygt;  lt;/itemgt;  lt;item iid="gps1015"gt;  lt;descriptiongt;Zendo GPS meterlt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="bl2815"gt;  lt;descriptiongt;Boot Laces (Medium)lt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="tr8140"gt;  lt;descriptiongt;Trail Mix (Pouch)lt;/descriptiongt;  lt;qtygt;5lt;/qtygt;  lt;/itemgt;  lt;item iid="fa8442"gt;  lt;descriptiongt;First Aid Kit (Pack Size)lt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="bb7117"gt;  lt;descriptiongt;Blister Patcheslt;/descriptiongt;  lt;qtygt;3lt;/qtygt;  lt;/itemgt;  lt;/ordergt;  lt;order oid="53003"gt;  lt;dategt;8/5/2017lt;/dategt;  lt;item iid="hp7814"gt;  lt;descriptiongt;Fiberglass Light Hiking Poles (Spring Adj.)lt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;/ordergt;  lt;order oid="54814"gt;  lt;dategt;8/6/2017lt;/dategt;  lt;item iid="sb6601"gt;  lt;descriptiongt;Solar Battery Recharging Unitlt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="br9002"gt;  lt;descriptiongt;Bug Repellent (Deep Woodes)lt;/descriptiongt;  lt;qtygt;2lt;/qtygt;  lt;/itemgt;  lt;item iid="sb8502"gt;  lt;descriptiongt;Sunblock SPF 30 (Hiking Size)lt;/descriptiongt;  lt;qtygt;6lt;/qtygt;  lt;/itemgt;  lt;/ordergt;  lt;/ordersgt;  lt;/customergt;  lt;customer cid="c5614"gt;  lt;namegt;Sandoval, Tammylt;/namegt;  lt;streetgt;641 Greenway Blvd.lt;/streetgt;  lt;citygt;Galesburglt;/citygt;  lt;stategt;NDlt;/stategt;  lt;zipgt;58035lt;/zipgt;  lt;ordersgt;  lt;order oid="52144"gt;  lt;dategt;8/3/2017lt;/dategt;  lt;item iid="sg8128"gt;  lt;descriptiongt;Polarized Snow Goggleslt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="sh5591"gt;  lt;descriptiongt;Snow Helmet Women'slt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="sb5317"gt;  lt;descriptiongt;Attack Snowboard Women'slt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="pw6558"gt;  lt;descriptiongt;Insulated Pants Women'slt;/descriptiongt;  lt;qtygt;2lt;/qtygt;  lt;/itemgt;  lt;item iid="pj5199"gt;  lt;descriptiongt;Insulated Jacket Women'slt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="bl6638"gt;  lt;descriptiongt;Snowboard Leashlt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;/ordergt;  lt;order oid="53410"gt;  lt;dategt;8/6/2017lt;/dategt;  lt;item iid="ws6832"gt;  lt;descriptiongt;Snowshoes Women'slt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;item iid="sp5588"gt;  lt;descriptiongt;Snowshoes Pairlt;/descriptiongt;  lt;qtygt;1lt;/qtygt;  lt;/itemgt;  lt;/ordergt;  lt;/ordersgt;  lt;/customergt; lt;/customersgt;  

Css file /* Default styles */

 * {  margin: 0px;  list-style: none; }  header, section, article {  display: block; }    /* Body styles */ body {  font-family: Verdana, Geneva, sans-serif;  background-color: white; }  div#wrap {  background-color: white;  margin: 0px auto;  width: 780px;  border-left: 1px solid rgb(151, 151, 151);  border-right: 1px solid rgb(151, 151, 151);   box-shadow: rgb(191, 191, 191) 10px 0px 30px,  rgb(191, 191, 191) -10px 0px 30px; }  header {  background-color: rgb(120, 157, 40);  padding: 5px; }  header h1 {  font-size: 2.4em;  color: rgb(150, 187, 60);  text-shadow: black 1px 1px 1px,  white 0px -2px 0px;  margin-left: 20px; }  section {  margin-top: 10px;  margin-left: 20px;  }  section h1 {  font-size: 1.8em;  color: rgb(51, 51, 51);  text-shadow: rgb(150, 187, 60) 1px 1px 4px;  margin: 0px 0px 30px 0px; }  table.cdata {  border-collapse: collapse;  border: 1px solid rgb(151, 151, 151);  background-color: rgb(231, 231, 231);  font-size: 0.8em;  margin-top: 10px;  margin-bottom: 30px; }  table.cdata th {  text-align: left;  background-color: rgb(191, 191, 191);  border: 1px solid rgb(101, 101, 101);  padding: 3px;  width: 100px;  font-weight: normal;  vertical-align: top; }  table.cdata td {  text-align: left;  width: 250px;  border: 1px solid rgb(101, 101, 101);  padding: 3px;  vertical-align: top; }  article {  border-bottom: 1px solid rgb(111, 151, 71);  padding-bottom: 15px;  }  span {  color: rgb(131, 131, 131); }  table.items span.oid {  float: right; }  table.items span.date {  float: left; }  table.items tr {  clear: both; }  table.items {  border-collapse: collapse;  border: 1px solid rgb(191,211, 171);  font-size: 0.8em;  margin-top: 8px; }  table.items td, table.items th {  border: 1px solid rgb(151, 151, 151);  padding: 3px 7px; }  table.items thead tr:last-of-type th {  font-weight: normal;  background-color: rgb(191, 191, 191); }  table.items tbody tr:nth-child(even) {  background-color: rgb(231, 255, 211); }  table.items tr td:nth-child(1) {  width: 100px; }  table.items tr td:nth-child(2) {  width: 350px; }  table.items tr td:nth-child(3) {  width: 50px;  text-align: right; }  

This is my campingtxt.xsl stylesheet which has to be converted to a html page

 lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"gt;  lt;xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" /gt;  lt;xsl:template match="/"gt;  lt;htmlgt;  lt;headgt;  lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /gt;  lt;titlegt;Customer Orders at Cairn Campinglt;/titlegt;  lt;link href="cstyles.css" rel="stylesheet" type="text/css" /gt;  lt;/headgt;  lt;bodygt;  lt;div id="wrap"gt;  lt;headergt;  lt;h1gt;Cairn Camping Storelt;/h1gt;  lt;/headergt;  lt;sectiongt;  lt;h1gt;Customer Orderslt;/h1gt;  lt;articlegt;  lt;xsl:for-each select="customers/customer"gt;    lt;xsl:sort select="name" /gt;  lt;table class="cdata"gt;  lt;trgt;  lt;thgt;Namelt;/thgt;  lt;tdgt;  lt;xsl:value-of select="name" /gt;  lt;/tdgt;  lt;/trgt;  lt;trgt;  lt;thgt;Addresslt;/thgt;  lt;tdgt;  lt;xsl:value-of select="street"/gt;  lt;brgt;   lt;xsl:value-of select="city" /gt;  ,   lt;xsl:value-of select="state" /gt;  lt;/brgt;  lt;brgt;   lt;xsl:value-of select="zip" /gt;  lt;/brgt;  lt;/tdgt;  lt;/trgt;  lt;trgt;  lt;thgt;Customer IDlt;/thgt;  lt;tdgt;  lt;xsl:value-of select="@cid" /gt;  lt;/tdgt;  lt;/trgt;  lt;/tablegt;  lt;xsl:for-each select ="orders/order"gt;  lt;xsl:sort select="@oid" order="descending" /gt;   lt;table class="items"gt;  lt;theadgt;  lt;trgt;  lt;th colspan="3"gt;  lt;span class="date"gt;  lt;xsl:value-of select="date" /gt;  lt;/spangt;  lt;span class="oid"gt;  lt;xsl:value-of select="@oid" /gt;    lt;/spangt;lt;/thgt;  lt;/trgt;  lt;trgt;  lt;thgt;Item No.lt;/thgt;  lt;tdgt;lt;xsl:value-of select="iid" /gt; lt;/tdgt;  lt;thgt;Descriptionlt;/thgt;  lt;tdgt;lt;xsl:value-of select="description" /gt; lt;/tdgt;  lt;thgt;Qtylt;/thgt;  lt;tdgt;lt;xsl:value-of select="qty" /gt; lt;/tdgt;  lt;/trgt;  lt;/theadgt;  lt;tbodygt;  lt;trgt;  lt;/trgt;  lt;/tbodygt;  lt;/tablegt;  lt;/xsl:for-eachgt;   lt;/xsl:for-eachgt;  lt;/articlegt;  lt;/sectiongt;  lt;/divgt;  lt;/bodygt;  lt;/htmlgt;  lt;/xsl:templategt; lt;/xsl:stylesheetgt;  

Ответ №1:

Сделайте это последним tbody (который в настоящее время выводит одну пустую строку с lt;tbodylt;trgt;lt;/trgt;lt;/tbodygt; ) item вместо этого выведите s:

 lt;tbodygt;  lt;xsl:for-each select="item"gt;  lt;xsl:sort select="qty" data-type="number" order="descending"/gt;  lt;xsl:sort select="description"/gt;  lt;trgt;  lt;tdgt;  lt;xsl:value-of select="@iid"/gt;  lt;/tdgt;  lt;tdgt;  lt;xsl:value-of select="description"/gt;  lt;/tdgt;  lt;tdgt;  lt;xsl:value-of select="qty"/gt;  lt;/tdgt;  lt;/trgt;  lt;/xsl:for-eachgt;  lt;/tbodygt;  

Кроме того, я не думаю , что в предыдущем thead , вы хотите шесть столбцов, вы хотите три, с именами, например

 lt;trgt;  lt;thgt;Item No.lt;/thgt;  lt;thgt;Descriptionlt;/thgt;  lt;thgt;Qtylt;/thgt;  lt;/trgt;  

Комментарии:

1. Большое спасибо, что вы внесли свой вклад в мой код, решили вопрос именно так, как мне было нужно, и еще раз спасибо за то, что точно указали, что нужно сделать.