XSLT Встроенные Шаблонные Правила для атрибутов

Я уверен, что это - чрезвычайно основной вопрос, но здесь идет так или иначе! Я считал, что созданные в шаблонном правиле для текста и приписывают узлы в 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

7
задан Martin Smith 14 May 2010 в 15:32
поделиться

2 ответа

Поскольку встроенное правило для элементов не применяет шаблоны к собственным атрибутам элемента, а только к его дочерним элементам. Если вы хотите перемещаться по атрибутам так же, как и по дочерним элементам (что, вероятно, является искусственной задачей), вам необходимо определить собственное значение по умолчанию:

<xsl:template match="*">
    <xsl:apply-templates select="@*"/>
    <xsl:apply-templates/>
</xsl:template>
6
ответ дан 6 December 2019 в 15:19
поделиться

Чтобы ответить на этот вопрос из комментария:

Спасибо, мне не нужно это делать, я просто пытаюсь понять правила. То есть, по сути, @* часть встроенного правила никогда не будет вызвана, если она не вызвана явно?

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

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

<xsl:template match="/|*">
  <xsl:apply-templates/>
</xsl:template>

Когда документ обрабатывается, второй шаблон соответствует корню и apply-templates. По умолчанию для apply-templates выбираются все дочерние узлы (атрибуты, как ни странно, не являются дочерними узлами). Вы никогда не выбираете ни один атрибут для обработки, поскольку единственный apply-templates появляется в форме по умолчанию.

Так что если бы вы выбрали где-нибудь какой-нибудь атрибут (как это сделал Винсент Маркетти), он был бы обработан первым упомянутым шаблоном по умолчанию.

6
ответ дан 6 December 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: