Я конвертирую файл 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">
в исходном примере.