ancestor
- для выбора узлов, которые находятся выше (ближе к корню) в документе XML. descendant
- для выбора узлов, которые находятся ниже (дочерние) в документе XML.
В вашем примере ancestor::criterion
ничего не выбирает, потому что текущий узел - /
(в данном случае это означает корень документа - <file>
), как указано match="/"
. Корневой узел не имеет предков, поэтому ось ancestor
ничего не делает.
Чтобы получить каждый элемент <criterion>
, вы должны использовать ось descendant
:
<xsl:template match="/">
<xsl:copy-of select="descendant::criterion"/>
</xsl:template>
Или его ярлык //
:
<xsl:template match="/">
<xsl:copy-of select="//criterion"/>
</xsl:template>
Это вернет следующее:
<criterion>AAA</criterion>
Используя цикл или другой шаблон, вы можете получить все три из них:
<xsl:template match="/">
<file>
<xsl:apply-templates select="//criterion"/>
</file>
</xsl:template>
<xsl:template match="criterion">
<xsl:copy-of select="."/>
</xsl:template>
Это приведет к следующему:
<file>
<criterion>AAA</criterion>
<criterion>BBB</criterion>
<criterion>CCC</criterion>
</file>
Если вы хотите получить элемент <file>
, это немного сложнее. XPath определяет узлы, и простые копии не будут копировать элементы, которые содержат выбранные вами элементы. Я могу уточнить этот момент, если вы все еще в замешательстве.