Подтвердить что ты не робот

Каков стандартный выбор шаблонов XSLT по умолчанию?

Шаблон идентичности выглядит следующим образом:

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

Выделяет ли <xsl:apply-templates select="@*|node()" /> больше, чем <xsl:apply-templates />, или может ли шаблон идентификации быть таким?

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

Что именно выбирается, когда я делаю следующее?

<xsl:apply-templates />
4b9b3361

Ответ 1

Выделяет ли <xsl:apply-templates select="@*|node()" /> больше, чем <xsl:apply-templates />, или может быть шаблон идентификации как это?

<xsl:apply-templates/> 

эквивалентно:

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

и это более короткий из них:

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

и это эквивалентно:

<xsl:apply-templates select="* | text() | comment() | processing-instruction()"/>

Как мы видим из последней инструкции, команда xsl:apply-templates, о которой вы спрашиваете, не выбирает никаких атрибутов, поэтому ее нельзя использовать в качестве сокращения для:

<xsl:apply-templates select="@*|node()"/>

Ответ 2

Выбор по умолчанию для <xsl:apply-templates/> - это просто "node()", он не включает атрибуты.

Ответ 3

выбор шаблонов Apply по умолчанию по умолчанию - node(), что сокращается для child::node(). Это выражение XPath оценивается следующим образом:

  • Сначала все узлы из "дочернего" оси. Это все прямые дочерние элементы текущего элемента, то есть другие элементы, текст и комментарии, но не атрибуты.
  • Затем этот набор node фильтруется с помощью node test "node()". В этом случае ни один элемент не фильтруется, потому что этот тест соответствует всем.

Итак, с <xsl:apply-templates /> применяются шаблоны для дочерних элементов, но не для атрибутов. В случае шаблона копирования это означает, что атрибуты не копируются.