Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pNum" select="3"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Class[History]">
<xsl:choose>
<xsl:when test="not(position() = $pNum)">
<xsl:call-template name="identity"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<AddThis>Ok</AddThis>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<College>
<Class>
<History>
<StudentName>Veronica</StudentName>
</History>
</Class>
<Class>
<History>
<StudentName>Jasmine</StudentName>
</History>
</Class>
<Class>
<History>
<StudentName>Rebecca</StudentName>
</History>
</Class>
</College>
дает желаемый, правильный результат :
<College>
<Class>
<History>
<StudentName>Veronica</StudentName>
</History>
</Class>
<Class>
<History>
<StudentName>Jasmine</StudentName>
</History>
</Class>
<Class>
<History>
<StudentName>Rebecca</StudentName>
</History>
<AddThis>Ok</AddThis>
</Class>
</College>
Объяснение : Очень типичное переопределение правила идентификации.
Решение XSLT 2.0 :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pNum" select="3"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Class[History][position() = $pNum]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<AddThis>Ok</AddThis>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Объяснение : Почти то же самое, что и решение XSLT 1.0, но короче, потому что в XSLT 2.0 допустимо, чтобы ссылка на переменную / параметр встречалась в шаблоне соответствия - поэтому мы полностью избавляемся явные условия.
Обновление : ОП теперь изменил проблему:
" извините, элемент" AddThis "должен был быть добавлен внутри
третий узел «История», не выходящий за пределы третьего узла «История», мой плохой. я
исправил это в моем посте с вопросом. Как бы я отредактировал ваш XSLT 1.0 в
исправить это? Благодарю. - Bug Spray"
Вот соответственно измененное решение :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pNum" select="3"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Class[History]">
<xsl:choose>
<xsl:when test="not(position() = $pNum)">
<xsl:call-template name="identity"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." mode="add"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="node()|@*" mode="add" name="id2">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="add"/>
</xsl:copy>
</xsl:template>
<xsl:template match="History/StudentName" mode="add">
<xsl:call-template name="id2"/>
<AddThis>Ok</AddThis>
</xsl:template>
</xsl:stylesheet>