Как xsl:apply-шаблоны могут соответствовать только шаблонам, которые я определил?

Когда вы делаете переменную с тем же именем в подклассе, это называется скрытием. В результате подкласс теперь будет иметь оба свойства. Вы можете получить доступ к одному из суперкласса с помощью super.var или ((SuperClass)this).var. Переменные не обязательно должны быть одного типа; это всего лишь две переменные, разделяющие имя, подобно двум перегруженным методам.

23
задан user43940 6 December 2008 в 15:10
поделиться

3 ответа

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

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

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

Read полное объяснение здесь: http://www.dpawson.co.uk/xsl/sect2/defaultrule.html

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

<xsl:template match="text()" />
40
ответ дан Mads Hansen 29 November 2019 в 01:02
поделиться

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

наблюдаемое поведение состоит точно в том, как XSLT-совместимый процессор shoud ведет себя.

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

        <xsl:apply-templates/>

сокращение для:

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

и существование встроенные шаблонные правила . Согласно спецификация .:

XSLT 1.0" 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 Так, если автор хочет полностью управлять обработкой XSLT, они должны переопределить все встроенные шаблоны .

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

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

24
ответ дан Dimitre Novatchev 29 November 2019 в 01:02
поделиться

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

<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 )

2
ответ дан Dirk Vollmar 29 November 2019 в 01:02
поделиться
Другие вопросы по тегам:

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