xsl:number - 排除某些元素

时间:2013-03-16 18:08:26

标签: xsl-fo

在xsl fo中,我需要使用prcitem1标记/计算名为xsl:number的元素,但我只想定位具有名为prcitem1的第二个后代的para个元素

编号的工作原理是唯一标记的元素是我刚刚描述的元素,但是如果有prcitem1元素不符合条件,即使标签未显示,它仍会被计算。这会导致编号不正确,就像从B开始而不是A.因为第一个prcitem1元素不符合标准但仍然计算在内。

我正在使用<xsl:number count="self::*[./prcitem1/para] format="A" from="task"。任务是prcitem1的包含元素,我在prcitem1模板内部计算。任何人都知道如何处理这个?

1 个答案:

答案 0 :(得分:0)

您只需要像这样计算prcitem1[para]

<xsl:number format="A" from="task" count="prcitem1[para]"/>

这是一个例子。它可能与你的完全不符,但应该接近......

XML输入

<doc>
    <task>
        <prclist1>
            <prcitem1>
                <prcitem>
                    <para>prcitem 1A</para>
                </prcitem>
            </prcitem1>
            <prcitem1>
                <prcitem>
                    <para>prcitem 2A</para>
                </prcitem>
            </prcitem1>
            <prcitem1/>
            <prcitem1>
                <prcitem>
                    <para>prcitem 4A</para>
                </prcitem>
            </prcitem1>
        </prclist1>
        <prclist1>
            <prcitem1>
                <prcitem>
                    <para>prcitem 1B</para>
                </prcitem>
            </prcitem1>
            <prcitem1/>
            <prcitem1>
                <prcitem>
                    <para>prcitem 3B</para>
                </prcitem>
            </prcitem1>
            <prcitem1>
                <prcitem>
                    <para>prcitem 4B</para>
                </prcitem>
            </prcitem1>
        </prclist1>
    </task>
</doc>

XSLT 2.0 (按原样使用1.0。)

<xsl:stylesheet version="2.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="doc">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
                    <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="my-page">
                <fo:flow flow-name="xsl-region-body">
                    <xsl:apply-templates/>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template match="prclist1">
        <fo:list-block font-size="10pt" provisional-distance-between-starts="24pt" space-before=".1in" space-after=".1in" keep-with-next.within-page="always">
            <xsl:apply-templates/>
        </fo:list-block>
    </xsl:template>

    <xsl:template match="prcitem1[prcitem/para]">
        <fo:list-item>
            <fo:list-item-label end-indent="label-end()" font-size="12pt" font-weight="bold">
                <fo:block>
                    <xsl:number format="A" from="task" count="prcitem1[prcitem/para]"/>
                </fo:block>
            </fo:list-item-label>
            <fo:list-item-body start-indent="body-start()" font-size="12pt">
                <fo:block>
                    <xsl:apply-templates select="prcitem/para"/>
                </fo:block>
            </fo:list-item-body>
        </fo:list-item>
    </xsl:template>

</xsl:stylesheet>

FO输出

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:layout-master-set>
      <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
         <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
      </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="my-page">
      <fo:flow flow-name="xsl-region-body">
         <fo:list-block font-size="10pt"
                        provisional-distance-between-starts="24pt"
                        space-before=".1in"
                        space-after=".1in"
                        keep-with-next.within-page="always">
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()" font-size="12pt" font-weight="bold">
                  <fo:block>A</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="body-start()" font-size="12pt">
                  <fo:block>prcitem 1A</fo:block>
               </fo:list-item-body>
            </fo:list-item>
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()" font-size="12pt" font-weight="bold">
                  <fo:block>B</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="body-start()" font-size="12pt">
                  <fo:block>prcitem 2A</fo:block>
               </fo:list-item-body>
            </fo:list-item>
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()" font-size="12pt" font-weight="bold">
                  <fo:block>C</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="body-start()" font-size="12pt">
                  <fo:block>prcitem 4A</fo:block>
               </fo:list-item-body>
            </fo:list-item>
         </fo:list-block>
         <fo:list-block font-size="10pt"
                        provisional-distance-between-starts="24pt"
                        space-before=".1in"
                        space-after=".1in"
                        keep-with-next.within-page="always">
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()" font-size="12pt" font-weight="bold">
                  <fo:block>A</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="body-start()" font-size="12pt">
                  <fo:block>prcitem 1B</fo:block>
               </fo:list-item-body>
            </fo:list-item>
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()" font-size="12pt" font-weight="bold">
                  <fo:block>B</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="body-start()" font-size="12pt">
                  <fo:block>prcitem 3B</fo:block>
               </fo:list-item-body>
            </fo:list-item>
            <fo:list-item>
               <fo:list-item-label end-indent="label-end()" font-size="12pt" font-weight="bold">
                  <fo:block>C</fo:block>
               </fo:list-item-label>
               <fo:list-item-body start-indent="body-start()" font-size="12pt">
                  <fo:block>prcitem 4B</fo:block>
               </fo:list-item-body>
            </fo:list-item>
         </fo:list-block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>

PDF输出

enter image description here