XSL - Как сопоставить или выбрать пустой элемент для вставки сгенерированного контента - PullRequest
0 голосов
/ 30 января 2020

Я конвертирую файл XML в HTML, используя XSLT. Часть преобразования включает в себя вывод навигационной панели. У меня есть некоторый код, который проходит по дереву, получает заголовок каждого раздела и выводит его в виде элемента списка. Тем не менее, некоторые типы разделов являются пустыми и полностью сгенерированы. Мне нужно иметь возможность вставить заголовок по умолчанию в панель навигации, когда эти разделы происходят. Я использую xsl:choose для вставки заголовков, но мне не удалось найти способ сопоставления с пустым элементом.

Я смотрел на другие решения, упомянутые здесь, включая тестирование на my-empty-element[. = ''] и my-empty-element[not(text())], но у меня это не сработало. Упрощенная версия моего XML документа:

<book>
  <section id="s1">
    <title>Section 1 Title</title>
    <!-- Other stuff here -->
  </section>
  <section-empty id="s2"/> <!-- My generated section -->
  <section id="s3">
    <title>Section 3 Title</title>
    <!-- Other stuff here -->
  </section>
</book>

Отредактировано, чтобы добавить дополнительные пояснения: Во время обычной обработки книги каждый раздел разбивается на отдельный файл , Поскольку каждый раздел обрабатывается, я включаю <xsl:call-template name="navbar"/>, поэтому на самом деле вызывается навигационная панель из раздела.

Для подтверждения, пустые разделы имеют другое имя, чем обычные разделы. Вот упрощенная версия моего XSL:

<xsl:template name="navbar">
<!-- I call this template in at the location of the navbar in my HTML document -->
  <xsl:apply-templates select="/book" mode="nav"/>
</xsl:template>
<xsl:template match="/book" mode="nav">
  <nav class="mainnav"><ul>
    <xsl:apply-templates select="section | section-empty" mode="nav"/>
  </ul></nav>
</xsl:template>

<xsl:template match="section | section-empty" mode="nav">
  <li><a>
    <xsl:attribute name="id"><xsl:value-of select="./@id"/></xsl.attribute>
    <xsl:choose>
      <xsl:when test="self::section"><xsl:value-of select="./title/text()"/></xsl:when>
      <xsl:when test="self::section-empty"><xsl:text>Generated Title</xsl:text></xsl:when>
      <xsl:otherwise/>
    </xsl:choose>
  </a></li>
</xsl:template>

Я также пытался создать отдельный шаблон для соответствия book/section-empty[.=''], но это не имело никакого значения. Мой текущий вывод выглядит следующим образом:

<nav><ul>
  <li><a href="s1">Section 1 Title</a></li>
  <li><a href="s3">Section 3 Title</a></li>
</ul</nav>

Я ценю любую помощь, которую кто-либо может предложить.

Отредактировано для включения тега закрытия для <xsl:attribute name="id"> в исходном примере.

Ответы [ 2 ]

2 голосов
/ 30 января 2020

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

<xsl:template match="/book" >
  <nav class="mainnav"><ul>
    <xsl:apply-templates select="section | section-empty" />
  </ul></nav>
</xsl:template>

<xsl:template match="section">
  <li>
      <a href="{@id}">
          <xsl:value-of select="title"/>
      </a>
  </li>
</xsl:template>

<xsl:template match="section-empty">
    <li>
        <a href="{@id}">Generated Title</a>
    </li>
</xsl:template>

https://xsltfiddle.liberty-development.net/3NSTbeV

0 голосов
/ 30 января 2020

Моя проблема заключалась в опечатке имени элемента в моем шаблонном совпадении. У меня была заглавная буква, где должна быть строчная буква. Я пропустил это при изучении моего кода. Мартин Хоннен подтвердил, что мой код должен работать, и предложил лучший пример для устранения неполадок, который помог мне найти мою ошибку.

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