仅当有多个段落时才对段落编号

Numbering of paragraphs only if there is more than one

我使用 XSLT 1.0 将简单的 XML 转换为 HTML。我使用模板对标题下的段落进行编号。如果标题下只有一个段落,我正在努力解决停用编号的条件。

我的XML:

<document title="Lorem Ipsum">
<heading title="Heading 1" id="HEADING-1">
    <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
    <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</heading>
<heading title="Heading 2" id="HEADING-2">
    <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</heading>

我的 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html lang="en">
    <body>
        <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="heading">
  <h1 id="{@id}">
    <xsl:number format="1. " level="multiple" count="heading"/>
    <xsl:value-of select="@title"/>
  </h1>

<xsl:apply-templates />
</xsl:template>

<xsl:template match="p">
  <p>
    <!-- TODO: If there is only one paragraph under a heading: no numbering! -->
    <xsl:number format="(1) " level="single" count="p"/>
    <xsl:apply-templates />
  </p>
</xsl:template>

</xsl:stylesheet>

使用此设置,不仅标题 1 下的两个段落被编号,而且标题 2 下的单个段落也被编号。如果一个标题下只有一个段落,我想停用编号。我尝试了很多条件,例如 <xsl:if test="number(node()) &gt; 1"><xsl:if test="count(*) &gt; 1"> 但找不到解决方案。

一个解决方案可能是这个:检查是否在当前正在处理的 <p> 之前(使用 preceding-sibling 轴)或之后(使用 following-sibling 轴)找到 p。

您可以通过修改样式表并添加如下条件来实现它:

<xsl:if test="preceding-sibling::p or following-sibling::p">
  <xsl:number format="(1) " level="single" count="p"/>
</xsl:if>

或很快:

<xsl:if test="count(../p) > 1">
    <xsl:number format="(1) "/>
</xsl:if>