2015-07-03 99 views
1

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

回答

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> 
+1

这是一个很好的解决方案,我们还可以补充说,之所以OP的'count(*)'测试不起作用,因为'p'模板中的'*'将引用'p'的子元素,其中OP真的想要计算'../*'或'../p相反。 – kjhughes

+0

太棒了!非常感谢! – user2496550

2

或简称:

您可以通过修改您的样式表,并添加条件像下面执行它

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