Удалил теги в выходном xml, не имеющие значений во входном xml, проверив его с помощью xslt - PullRequest
0 голосов
/ 10 сентября 2018

Я новичок в xslt. Попытка удалить тег из XML-файла результата / вывода, который не имеет значений для тега, присутствующего во входном файле xml. Но в выходном XML-файле теги, которые должны быть напечатаны, появляются несколько раз.

ВХОД xml

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price></price>
    <year>1985</year>
  </cd>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
  </cd>
  </catalog>

XSLT

 <?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" version="1.0" encoding="UTF-8" 
indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  <html>
  <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
<th>Price</th>
      </tr>
      <xsl:for-each select="catalog/cd">
      <tr>
        <td><xsl:value-of select="title" /></td>
        <td><xsl:value-of select="artist" /></td>
<td><xsl:value-of select="price" /></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
<xsl:template match="price[not(node())]"/>
</xsl:stylesheet>

ВЫХОД Ожидаемый HTML

Печать безТег <price></price>, который не имеет значения, но который на самом деле отображается в виде выходных данных, представляет собой несколько значений всех тегов. Помогите мне с этим

<html>
   <body>
      <h2>My CD Collection</h2>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th>Title</th>
            <th>Artist</th>
            <th>Price</th>
         </tr>
         <tr>
            <td>Empire Burlesque</td>
            <td>Bob Dylan</td>

         </tr>
         <tr>
            <td>Hide your heart</td>
            <td>Bonnie Tyler</td>
            <td>9.90</td>
         </tr>
      </table>
   </body>
</html>            

Но я получаю то, что он печатается в цикле несколько раз.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Проблема с вашим скриптом в том, что вы помещаете все в шаблон соответствие @*|node().

Шаблон с таким соответствием - это обычно шаблон идентификации , используемый при создании вывода XML.

Но вывод вашего скрипта - HTML-разметка с преобразованным вводом внутри (для каждого cd элемента).

Мое предложение:

  • Измените match="@*|node()" на match="/" (ваш шаблон должен соответствовать только узел документа).
  • Удалить фрагмент из <xsl:copy> до </xsl:copy> (включительно).

Редактировать

Другая проблема заключается в том, что если вы хотите получить вывод HTML метод вывода, вероятно, должен быть html, а не xml.

Ниже у вас есть переработанный скрипт, генерирующий XHTML:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" doctype-public="-//W3C//DTD XHTML 1.1//EN"
    doctype-system= "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>

  <xsl:template match="/">
    <html>
      <body>
        <h2>My CD Collection</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th>Title</th>
            <th>Artist</th>
            <th>Price</th>
          </tr>
          <xsl:for-each select="catalog/cd">
            <tr>
              <td><xsl:value-of select="title"/></td>
              <td><xsl:value-of select="artist"/></td>
              <td><xsl:value-of select="price"/></td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Если вам нужно, измените оба атрибута doctype-... в соответствии с вашими потребностями.

Обратите внимание, что пустой шаблон для price не нужен, потому что:

  • соответствующий шаблон / делает всю работу, без вызова apply-templates,
  • поэтому нет шансов, что элемент price будет обработан как соответствующий по любому шаблону.
0 голосов
/ 10 сентября 2018
add a condition for price tag
<xsl:template match="/">

        <html>
            <body>
                <h2>My CD Collection</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th>Title</th>
                        <th>Artist</th>
                        <th>Price</th>
                    </tr>
                    <xsl:for-each select="catalog/cd">
                        <tr>
                            <td><xsl:value-of select="title" /></td>
                            <td><xsl:value-of select="artist" /></td>
                            <xsl:choose>
                                <xsl:when test="price = ''"/>
                                <xsl:otherwise><td><xsl:value-of select="price" /></td></xsl:otherwise>
                            </xsl:choose>

                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...