Новый ответ
Внимательно прочитав ваш вопрос, я понимаю, что мои последние решения ни к чему вас не приведут.Мой новый ответ следующий:
Так как вам нужно знать, есть ли какие-либо элементы внутри Events
, вам нужно изменить /
соответствующий шаблон:
<xsl:template match="/">
<!-- Stuff -->
<xsl:apply-templates select="/Root/Events" />
<!-- Stuff -->
</xsl:template>
Теперь шаблон, который соответствует толькозаполнить Events
вместе с требуемым Event
шаблоном:
<xsl:template="Events[count(child::Event) > 0]">
<xsl:apply-template select='./Event'/>
</xsl:template>
<xsl:template="Event">
<!-- some stuff -->
</xsl:template>
Теперь шаблон, который соответствует пустому Events
:
<xsl:template="Events[count(child::Event) = 0]">
<p class="message">There are currently no upcoming events</p>
</xsl:template>
Старый ответ
Попробуйте с:
<!-- This matches every node with an empty string repr. Maybe you want
to replace "self::*" to avoid attributes, etc." -->
<xsl:template match="*[string-length(self::*) = 0]">
</xsl:template>
Подробности:
Если я правильно помню, в XPath / XSL '*' соответствует любому типу узлов, т. Е. Текстовым узлам, узлам элементов, узлам комментариев,узлы атрибута и т. д. Таким образом, в данном контексте *[string-length(self::*) = 0]
может совпадать с атрибутом;например, у вас может быть select='@*'
где-то еще.Таким образом, этот шаблон может быть применен как к атрибутам, так и к элементам.
Если вы уверены, что он не будет соответствовать ни одному атрибуту, вы можете оставить его как есть.Однако мне нравится, что мой код выражает правильные идеи.Итак, если этот шаблон будет применяться только к элементам Event, я бы изменил соответствие на что-то вроде:
<xsl:template match="Event[string-length(self::*) = 0]">
</xsl:template>
Взглянув на спецификацию XSLT на http://www.w3.org/TR/xslt,, кажется, что * соответствуеттолько элементы.Однако я бы проверил это.