Вам необходимо узнать о приоритетах соответствия шаблонов. В частности, шаблон, сопоставляющий элемент с условием, имеет более высокий приоритет, чем просто сопоставление имени элемента самостоятельно. (В частности, сопоставление с шаблоном line[1]
имеет приоритет 0,5, а сопоставление с шаблоном line
имеет приоритет 0.)
Это означает, что вам нужны только следующие шаблоны.
<xsl:template match="line[1]">
<newline />
</xsl:template>
<xsl:template match="line"/>
Итак, для первого элемента line
, хотя оба шаблона могли бы соответствовать ему, первый имеет более высокий приоритет, поэтому он будет использоваться во всех случаях.
См. https://www.w3.org/TR/xslt-10/#conflict для получения более подробной информации.
Попробуйте это XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="line[1]">
<newline />
</xsl:template>
<xsl:template match="line"/>
</xsl:stylesheet>
(Обратите внимание, что ваш шаблон, соответствующий /
, в этом случае не требуется, так как XSLT built-в шаблонах будет делать то же самое)