XSLT-файл - проблема с каждой функцией - PullRequest
0 голосов
/ 03 марта 2019

У меня есть файл, похожий на приведенный ниже:

  <catalog>
    <cd0>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year></cd0>
    <cd1>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd1>
    <cd2>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd2>
    .
    .
    .
</catalog>

Я бы хотел извлечь любой элемент узла <cd1>, <cd2>, <cd3> и т. Д. С помощьюдля каждой функции, но я не могу найти, как это сделать ....

Не могли бы вы мне помочь?

1 Ответ

0 голосов
/ 04 марта 2019

Грубо угадывая, чего вы пытаетесь достичь, вот несколько комментариев:

Зацикливание элементов в XSLT, скорее всего, является типичным подходом для начинающих для обработки тегов XML.В XML вы должны изменить свое мышление.Это означает не зацикливание тегов, а применение шаблонов, которые соответствуют определенному пути (xpath).

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="utf-8" indent="yes" />

  <xsl:template match="catalog">
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
      <head>
      </head>
      <body>
        <ul>
          <xsl:apply-templates />
        </ul>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="catalog/*">
    <li>
      <xsl:value-of select="title"/>
    </li>
  </xsl:template>
</xsl:stylesheet>

Я добавил простой пример и приведу некоторые пояснения:

  1. Ваш корневой тегОн называется catalog, поэтому процессор xslt говорит: «Круто, мы идем» и начинает применять шаблон, который подходит -> catalog.
  2. Затем in записывает эти примеры html-тегов, пока не встретит apply-templates.
  3. Он ищет шаблон cd0, cd1 и в конечном итоге находит шаблон, который подходит всем дочерним узлам (*) каталога.(И добавляет полные названия для полноты.)
  4. Надеюсь, это поможет вам.Не уверен, генерируете ли вы этот xml-макет, но номер не должен быть частью имени тега.Лучше:

    <cd id="0"> ... </cd>

Почему это лучше?Вы можете искать легче.Здесь проверяется индекс:

  <xsl:template match="cd[@id='1']">
    <li>
      <xsl:value-of select="title"/>
    </li>
  </xsl:template>

здесь проверяется год:

  <xsl:template match="cd[year/.&gt;1985]">
    <li>
   <xsl:value-of select="title"/>
    </li>
  </xsl:template>

Изучая xsl, вы наткнетесь на него, «генерируя слишком много выходных данных».Это связано с тем, что применяются шаблоны по умолчанию, которые копируют пройденные xml-теги и выводят их в ваш сгенерированный вывод.Я обычно добавляю этот пустой шаблон по умолчанию, он пишет --nothing, поэтому у вас есть полный контроль.

<xsl:template match="*">

</xsl:template>

Еще несколько советов для вас и всех, кто сталкивается: node () такой же, как *и запутанный

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

просто означает:

Используйте этот шаблон для каждого узла атрибута (@) ИЛИ (|) каждого узла тега (* или узла ()) и скопируйте егоСам узел к выходному документу, рекурсивно применяя и таким образом повторяя исходный документ.Теги комментариев игнорируются.

Надеюсь, это даст каждому новичку возможность набраться!Это на самом деле довольно круто и очень эффективно , если вы знаете, как его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...