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

时间:2015-07-03 13:04:10

标签: xslt xslt-1.0

我使用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">,但无法找到解决方案。

2 个答案:

答案 0 :(得分:2)

或者很快:

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

答案 1 :(得分:1)

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

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

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