Ваш тест <xsl:when test="a">
правильный, для проверки, имеет ли контекстный узел какие-либо дочерние элементы с именем a
.
"Однако, <xsl:when test="a">
никогда не совпадает, что бы я ни делал. "
Откуда ты знаешь, что это никогда не совпадает? Если вы предоставите примерный ввод, ожидаемый вывод и фактический вывод, мы можем лучше диагностировать причину, по которой ожидаемый вывод! = Фактический вывод.
Кстати, вы знаете, что
<xsl:template match="*">
<xsl:apply-templates mode="foo" />
</xsl:template>
будет ли применять шаблон режима "foo" ко всем дочерним элементам каждого элемента? (который, в свою очередь, будет рекурсивно применять его ко всем детям этих детей). Так что если у вас есть документ
<w><x><y><z/></y></x></w>
тогда элемент z
будет обработан 3 раза в режиме "foo".
Может быть, вы имели в виду, что первый шаблон будет
<xsl:template match="/">
<xsl:apply-templates mode="foo" />
</xsl:template>
Мне также нравится помещать явный select="*"
в apply-шаблоны, просто чтобы было легче увидеть, что происходит. Но это вопрос предпочтений.