使用 xsl:number 来计算元素 XSLT 3.0 XSL-FO 的问题

卡罗琳

我正在尝试给 编号<para>s<para>每个只有一个crewDrillStep但我们可以嵌套crewDrillSteps。除非有<if>块,否则它会按预期工作,然后重新编号。如果我删除<if>然后它编号正确。

我用 Martin 的建议更新了这个例子,它非常接近,但可能不止一个crewDrill,我注意到在某些情况下,第二级的编号para没有重新开始。在 xml 中还有一些带有项目符号的段落,它们不会被编号。

鉴于:

<crew>
    <crewRefCard>
        <title>Expanded Self-Test Procedures </title>
        <crewDrill>
           <if>
              <caseCond>After program stops at test No. 1:</caseCond>
              <crewDrillStep id="d1e21189">
                 <para>RESET switch - ELEC.</para>
              </crewDrillStep>
              <crewDrillStep id="d1e21195">
                 <para>Flip red switches:</para>
                 <crewDrillStep id="d1e21200">
                    <para>Right.</para>
                 </crewDrillStep>
                 <crewDrillStep id="d1e21206">
                    <para>Left.</para>
                 </crewDrillStep>
                 <crewDrillStep id="d1e21212">
                    <para>Rudder.</para>
                 </crewDrillStep>
              </crewDrillStep>
              <crewDrillStep id="d1e21219">
                 <para>Flip orange switch.</para>
                 <crewDrillStep id="d1e21224">
                    <para>Test No. advances to 2.</para>
                 </crewDrillStep>
                 <crewDrillStep id="d1e21230">
                    <para>Yellow caution light - On.</para>
                 </crewDrillStep>
                 <crewDrillStep id="d1e21236">
                    <para>Red warning light - On.</para>
                 </crewDrillStep>
                 <crewDrillStep id="d1e21242">
                    <para>Program stops.</para>
                 </crewDrillStep>
              </crewDrillStep>
        </crewDrill>
    </crewRefCard>
</crew>

和:

<xsl:template name="para" match="para | notePara | warningAndCautionPara | attentionListItemPara">
    <fo:block text-align="justify">           
        <xsl:choose>
            <xsl:when test="self::para and (parent::crewDrillStep)">
                <fo:block>
                    <xsl:choose>
                        <xsl:when test="count(ancestor::crewDrillStep)=1">
                            <xsl:number from="crewDrill" level="any" count="crewDrillStep"/>
                        </xsl:when>
                        <xsl:when test="count(ancestor::crewDrillStep)=2 ">     
                            <xsl:attribute name="margin-left" select="'.25in'"/>
                            <xsl:number from="crewDrill/crewDrillStep" level="any" count="para[count(ancestor::crewDrillStep) = 2][not(starts-with(normalize-space(.),'•'))]" format="a. "/>
                        </xsl:when>
                        <xsl:when test="count(ancestor::crewDrillStep)=3">
                            <xsl:attribute name="margin-left" select="'.50in'"/>
                            <xsl:number from="crewDrill" count="crewDrillStep" format="(1) "/> 
                        </xsl:when>
                        <xsl:otherwise/>
                    </xsl:choose>
                </fo:block>
                <fo:block>
                    <xsl:apply-templates select="node()" mode="include"/>
                </fo:block>
            </xsl:when>
        </xsl:choose>
    </fo:block>
</xsl:template>

期望的输出:

Expanded Self-Test Procedures
After program stops at test No. 1:
1. RESET switch - ELEC.
2. Flip red switches:
    a. Right
    b. Left.
    c. Rudder.
3. Flip orange switch.
    a. Test No. advances to 2.
    b. Yellow caution light - On.
    c. Red warning light - On.
    d. Program stops.

实际输出:

Expanded Self-Test Procedures
After program stops at test No. 1:
1. RESET switch - ELEC.
2. Flip red switches:
    a. Right
    b. Left.
    c. Rudder.
3. Flip orange switch.
    d. Test No. advances to 2.
    e. Yellow caution light - On.
    f. Red warning light - On.
    g. Program stops.
马丁·霍南

如果我理解你的意图是正确的,那么做

                      <xsl:when test="count(ancestor::crewDrillStep)=2 ">     
                          <xsl:attribute name="margin-left" select="'.25in'"/>
                          <xsl:number from="crewDrill/crewDrillStep" level="any" count="para[count(ancestor::crewDrillStep) = 2]" format="a. "/>
                      </xsl:when>

代替

                    <xsl:when test="count(ancestor::crewDrillStep)=2 ">     
                        <xsl:attribute name="margin-left" select="'.25in'"/>
                        <xsl:number from="crewDrill" count="crewDrillStep" format="a. "/>
                    </xsl:when>

应该为那些第二级paras提供想要的编号

作为使用 的替代方法xsl:number,可以定义和使用累加器:

  <xsl:accumulator name="para-count-seq" as="xs:integer*" initial-value="()">
    <xsl:accumulator-rule match="crewDrill" select="0"/>
    <xsl:accumulator-rule match="crewDrill" phase="end" select="()"/>
    <xsl:accumulator-rule match="crewDrillStep" select="$value, 0"/>
    <xsl:accumulator-rule match="crewDrillStep" phase="end" select="$value[position() lt last()]"/>
    <xsl:accumulator-rule match="para" 
        select="let $pos := count(ancestor::crewDrillStep)
                return ($value[position() lt $pos], $value[$pos] + 1, $value[position() gt $pos])"/>
  </xsl:accumulator>

  <xsl:mode use-accumulators="para-count-seq"/>

然后para用例如输出每个数字

  <xsl:template match="para">
    <xsl:number 
        value="accumulator-before('para-count-seq')[last() - 1]" 
        format="{('1. ', 'a. ', '(1)')[count(current()/ancestor::crewDrillStep)]}"/>
  </xsl:template>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章