Я уверен, что это - чрезвычайно основной вопрос, но здесь идет так или иначе! Я считал, что созданные в шаблонном правиле для текста и приписывают узлы в XSLT,
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
Однако для исходного документа
<?xml version="1.0"?>
<booker>
<award>
<author blah="test">Aravind Adiga</author>
<title>The White Tiger</title>
<year>2008</year>
</award>
</booker>
И XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
</xsl:stylesheet>
Я получаю следующий вывод, применяющий преобразование в Visual Studio. Кто-то может объяснить, почему я не вижу "тест" в выводе?
Aravind Adiga
Белый тигр
2008
Поскольку встроенное правило для элементов не применяет шаблоны к собственным атрибутам элемента, а только к его дочерним элементам. Если вы хотите перемещаться по атрибутам так же, как и по дочерним элементам (что, вероятно, является искусственной задачей), вам необходимо определить собственное значение по умолчанию:
<xsl:template match="*">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:template>
Чтобы ответить на этот вопрос из комментария:
Спасибо, мне не нужно это делать, я просто пытаюсь понять правила. То есть, по сути, @* часть встроенного правила никогда не будет вызвана, если она не вызвана явно?
В этом случае, есть два правила по умолчанию, которые нас интересуют:
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="/|*">
<xsl:apply-templates/>
</xsl:template>
Когда документ обрабатывается, второй шаблон соответствует корню и apply-templates. По умолчанию для apply-templates выбираются все дочерние узлы (атрибуты, как ни странно, не являются дочерними узлами). Вы никогда не выбираете ни один атрибут для обработки, поскольку единственный apply-templates
появляется в форме по умолчанию.
Так что если бы вы выбрали где-нибудь какой-нибудь атрибут (как это сделал Винсент Маркетти), он был бы обработан первым упомянутым шаблоном по умолчанию.