user2496550
user2496550

Reputation: 603

Numbering of paragraphs only if there is more than one

I use XSLT 1.0 to transform a simple XML to HTML. I use a template to number the paragraphs under a heading. I'm struggling with a condition that deactivates numbering if there is only one paragraph under a heading.

My 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>

My 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>

With this setup, not only the two paragraphs under Heading 1 are numbered, but also the single paragraph under Heading 2. I'd like to deactivate numbering if there is only one paragraph under a heading. I tried many conditions like <xsl:if test="number(node()) &gt; 1"> and <xsl:if test="count(*) &gt; 1"> but cannot find the solution.

Upvotes: 1

Views: 69

Answers (2)

michael.hor257k
michael.hor257k

Reputation: 117102

Or shortly:

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

Upvotes: 2

potame
potame

Reputation: 7905

One solution may be this one: checking if a p is found before (with the preceding-sibling axis) or after (with the following-sibling axis) the <p> currently being processed.

You can implement it by modifying your stylesheet and adding a condition like below:

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

Upvotes: 1

Related Questions