XSLT Встроенный шаблон правил для атрибутов - PullRequest
7 голосов
/ 14 мая 2010

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

Аравинд Адига

Белый Тигр

2008

Ответы [ 3 ]

6 голосов
/ 14 мая 2010

Для ответа на этот вопрос из комментария:

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

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

<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 голосов
/ 14 мая 2010

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

<xsl:template match="*">
    <xsl:apply-templates select="@*"/>
    <xsl:apply-templates/>
</xsl:template>
2 голосов
/ 27 августа 2010

Основное правило - атрибуты вообще не имеют идентичности - они доступны только как боковые биты, прикрепленные к узлу . Хорошо думать о них как о несуществующих, пока у вас не появится первый узел. Вы также можете думать о них как о совершенно второсортных гражданах в мире XPath и XSLT. Каждый раз, когда вы используете их в условиях выбора, это похоже на переход от соединения к курсору в SQL, и каждый раз, когда вы используете «для» вместо «применять», происходит то же самое.

Другой способ выразить это - единственный реальный, эффективный «индекс», который у вас есть, это тот, который содержит все XPath-ы в документе (.Net фактически создает Hashtable из XPaths => совпадение с постоянным временем). Причиной того, что «apply» является привилегированным, является то, что он гарантирует чисто функциональную обработку - вы можете запускать все совпадающие, применяя apply в отдельных потоках без синхронизации и разделения памяти - вы просто объединяете их результаты.

Третий способ взглянуть на это, который натянут, представьте, что ваши теги являются таблицами SQL и что у вас есть только суррогатные PK-ы и FK-ы - ничего другого, что вы действительно можете выбрать, кроме «все из T1 и все связанные с ним» им от Т2 ". Для любого приличного движка SQL это похоже на усилия с 0 затратами - он просто читает один хороший индексный элемент за элементом, так как сама структура составляет 1-1 в вашем запросе. Все остальное стоит намного дороже.

После того, как вы выбрали теги, и шаблоны соответствовали и запустились, тогда дешево просто получить значения атрибутов - до тех пор, пока вы просто преобразуете / визуализируете их. Тесты Attrib в конце XPath также достаточно дешевы - опять же, поскольку выбран последний тег / узел, а теперь это всего лишь небольшой фильтр поверх него.

Итак, механизм XSLT и выбор XPath в целом имеют очень веские основания для полного игнорирования атрибутов - perf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...