Ответ заключается в простом предоставлении атрибута count=
вашей инструкции <xsl:number>
:
<xsl:number format="1." count="section[ex:isValidChapter(@name)]"/>
Таким образом, при нумерации разделов будут учитываться только «действительные» разделы, поэтому нумерациябудет правильным.
Также обратите внимание, что вам нужно изменить свой шаблон, который говорит:
<xsl:template match="/">
<xsl:apply-templates select="chapter" />
, поскольку <chapter>
не является дочерним элементом корневого узла.(Это дочерний элемент элемента документа, <book>
.) Например,
<xsl:template match="/book">
<xsl:apply-templates select="chapter" />
Кроме того, ваша функция не нуждается в выборе / когда / в противном случае для преобразования логического результата в логический.Его можно сократить до:
<xsl:function name="ex:isValidChapter" as="xs:boolean">
<xsl:param name="str-in" as="xs:string"/>
<xsl:sequence select="contains($validChapters, $str-in)"/>
</xsl:function>