Поскольку ваш исходный XML имеет пространство имен по умолчанию (http://www.daisy.org/z3986/2005/ncx/),, мы объявим его в таблице стилей как:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ncx="http://www.daisy.org/z3986/2005/ncx/"
version="1.0">
затем мы подсчитываем количество navPoint
узлов и сохраняем их в переменной
<xsl:variable name="navPointCount" select="count(//ncx:navPoint)"/>
и у нас есть шаблон идентификации для копирования всех узлов
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
затем мы сопоставляем целевой узел pageTarget
, теперь он становится ncx:pageTarget
, чтобы сказать, что это pageTarget
узел в пространстве имен ncx
<xsl:template match="ncx:pageTarget">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<!-- here, playOrder attribute is being inserted -->
<xsl:attribute name="playOrder">
<xsl:value-of select="count(preceding-sibling::ncx:pageTarget) + $navPointCount + 1"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
вся таблица стилей теперь становится:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ncx="http://www.daisy.org/z3986/2005/ncx/"
version="1.0">
<xsl:variable name="navPointCount" select="count(//ncx:navPoint)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ncx:pageTarget">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="playOrder">
<xsl:value-of select="count(preceding-sibling::ncx:pageTarget) + $navPointCount + 1"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
увидеть это в действии здесь .