Reputation: 603
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()) > 1">
and <xsl:if test="count(*) > 1">
but cannot find the solution.
Upvotes: 1
Views: 69
Reputation: 117102
Or shortly:
<xsl:if test="count(../p) > 1">
<xsl:number format="(1) "/>
</xsl:if>
Upvotes: 2
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