Как xsl: apply-templates может соответствовать только шаблонам, которые я определил? - PullRequest
22 голосов
/ 06 декабря 2008

У меня есть несколько шаблонов, которые соответствуют различным узлам в документе XML. Если я просто сделаю
он как-то рекурсивно выводит текст всех узлов ниже. Я просто хочу, чтобы он рекурсивно соответствовал любому шаблону, который я определил. Как я могу это сделать ?

Ответы [ 3 ]

38 голосов
/ 06 декабря 2008

Это происходит из-за встроенные шаблоны в XSLT. XSLT имеет пара встроенных шаблонов, которые говорят:

  • когда вы применяете шаблоны к элементу, обрабатываете его дочерние элементы
  • когда вы применяете шаблоны к текстовому узлу, укажите его значение

Вместе это означает, что если вы подаете заявку шаблоны для элемента, но не имеют явный шаблон для этого элемента, затем его содержимое обрабатывается и в конечном итоге вы в конечном итоге с текстом что элемент содержит.

Прочитайте полное объяснение здесь: http://www.dpawson.co.uk/xsl/sect2/defaultrule.html

Вы можете переопределить шаблоны по умолчанию для текстовых узлов, определив свой собственный шаблон, и он ничего не делает.

<xsl:template match="text()" />
24 голосов
/ 06 декабря 2008

Это, вероятно, самая частая проблема, с которой сталкиваются даже опытные программисты XSLT.

Наблюдаемое поведение в точности соответствует поведению XSLT-совместимого процессора.

Примите во внимание, что:

<xsl:apply-templates/>

является аббревиатурой для:

<xsl:apply-templates select="child::node()"/>

и наличие встроенных шаблонных правил . В соответствии с XSLT 1.0 Spec .:

" 5.8 Встроенные правила шаблонов

Существует встроенное правило шаблона, позволяющее продолжить рекурсивную обработку при отсутствии успешного сопоставления с образцом с помощью явного правила шаблона в таблице стилей. Это шаблонное правило применяется как к узлам элемента, так и к корневому узлу. Ниже показан эквивалент встроенного правила шаблона:

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

Существует также встроенное правило шаблона для каждого режима, которое позволяет рекурсивной обработке продолжаться в том же режиме при отсутствии успешного сопоставления с образцом с помощью явного правила шаблона в таблице стилей. Это шаблонное правило применяется как к узлам элемента, так и к корневому узлу. Ниже показан эквивалент встроенного правила шаблона для режима m.

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

Существует также встроенное шаблонное правило для узлов текста и атрибутов, которое копирует текст:

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

Встроенное шаблонное правило для обработки инструкций и комментариев - ничего не делать.

<xsl:template match="processing-instruction()|comment()"/>

Встроенное шаблонное правило для узлов пространства имен также ничего не делает. Нет шаблона, который мог бы соответствовать узлу пространства имен; Итак, встроенное шаблонное правило является единственным шаблонным правилом, которое применяется к узлам пространства имен.

Встроенные правила шаблона обрабатываются так, как если бы они были неявно импортированы до таблицы стилей, и поэтому имеют более низкий приоритет импорта , чем все другие правила шаблона. Таким образом, автор может переопределить встроенное шаблонное правило , включив явное шаблонное правило «

--- Конец XSLT Spec цитаты ---

Итак, если автор хочет полностью контролировать обработку XSLT, он должен переопределить все встроенные шаблоны .

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

<xsl:template match="text()" />

2 голосов
/ 06 декабря 2008

вы можете установить режим для применения только ваших собственных шаблонов:

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

<xsl:template match="somenode" mode="myMode">
  <!-- do something here -->
</xsl:template>

Другим вариантом будет перезапись встроенных шаблонов правил (см., Например, http://unix.com.ua/orelly/xml/xmlnut/ch08_07.htm)

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