Каков стандартный выбор шаблонов 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 />
Ответы
Ответ 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 />
применяются шаблоны для дочерних элементов, но не для атрибутов. В случае шаблона копирования это означает, что атрибуты не копируются.