Xml 链接中的XSL-FO段落编号

Xml 链接中的XSL-FO段落编号,xml,xslt,xsl-fo,Xml,Xslt,Xsl Fo,我正在生成S1000D xml的PDF,需要显示指向另一个步骤的链接,给出该步骤的编号/字母名称。在下图中,当前显示为指向1.d的链接。应改为1.c 包含ref的源xml如下所示: <mainProcedure> <proceduralStep id="S0001"> <para id="P0001">REMOVE COMPONENT XYZ.</para> <proceduralStep id="S0002">

我正在生成S1000D xml的PDF,需要显示指向另一个步骤的链接,给出该步骤的编号/字母名称。在下图中,当前显示为指向1.d的链接。应改为1.c

包含ref的源xml如下所示:

<mainProcedure>
<proceduralStep id="S0001">
    <para id="P0001">REMOVE COMPONENT XYZ.</para>
    <proceduralStep id="S0002">
        <para id="P0002">This is a second level procedural step.</para>
        <proceduralStep id="S0003">
            <para id="P0003">This is a third level procedural step.</para>
            <proceduralStep id="S0004">
                <para id="P0004">This is a fourth level procedural step.</para>
                <proceduralStep id="S0006">
                    <para id="P0006">This is a fifth level procedural step.</para>
                </proceduralStep>
            </proceduralStep>
        </proceduralStep>
    </proceduralStep>
    <proceduralStep id="S0005">
        <para id="P0005">This is a second, second level procedural step.</para>
    </proceduralStep>
    <proceduralStep id="S0008">
        <para id="P0008">The following sub-step has quantity data included.</para>
        <proceduralStep id="S0009">
            <para>Position bracket on frame and secure with bolts and washers. <emphasis
>TORQUE BOLT TO <quantity>
                        <quantityGroup quantityGroupType="minimum"
quantityUnitOfMeasure="ft.lbf">
                            <quantityValue>10</quantityValue>
                        </quantityGroup>
                        <quantityGroup quantityGroupType="maximum"
quantityUnitOfMeasure="ft.lbf">
                            <quantityValue>15</quantityValue>
                        </quantityGroup>
                    </quantity>
                </emphasis>.</para>
        </proceduralStep>
    </proceduralStep>
    <proceduralStep id="S0007">
        <para id="P0007">This is a para with a reference to <internalRef
internalRefId="S0008" internalRefTargetType="step"> another step</internalRef
> in the procedure.</para>
    </proceduralStep>
</proceduralStep>

移除组件XYZ。
这是第二级程序步骤。
这是第三级程序步骤。
这是第四级程序步骤。
这是第五级程序步骤。
这是第二,第二级程序步骤。
以下子步骤包含数量数据。
将支架放置在机架上,并用螺栓和垫圈固定。将螺栓拧紧至
10
15
.
这是一个涉及程序中另一个步骤的段落。

这是我的XSL,它给出了错误的数字/字母组合。它似乎给了我包含链接的步骤的编号(还有另一个处理
数据的模板:

<xsl:template match="internalRef[@internalRefTargetType='step']">
        <xsl:variable name="refId" select="./@internalRefId"/>
        <xsl:if test="//mainProcedure//proceduralStep/@id = $refId">
            <xsl:if test="//mainProcedure/proceduralStep/@id = $refId">
                <fo:inline>
                    <fo:basic-link internal-destination="{$refId}" color="blue" text-decoration="underline">
                        Step <xsl:number level="multiple" count="mainProcedure/proceduralStep" format="1."/>
                    </fo:basic-link>
                </fo:inline>
            </xsl:if>
            <xsl:if test="//mainProcedure/proceduralStep/proceduralStep/@id = $refId">
                <fo:inline>
                    <fo:basic-link internal-destination="{$refId}" color="blue" text-decoration="underline">
                        Step <xsl:number level="multiple" count="//mainProcedure/proceduralStep" format="1."/><xsl:number level="single" count="//mainProcedure/proceduralStep | proceduralStep" format="a."/>
                    </fo:basic-link>
                </fo:inline>
            </xsl:if>
        </xsl:if>
    </xsl:template>

步
步

非常感谢任何帮助我走上正确的道路。

我认为你把
xsl:number
弄得太复杂了。你应该能够只使用一个
xsl:number
并消除
xsl:if
(通过执行
xsl:apply templates
和使用一个moded模板)

但是,我在
format
属性中遇到了paren的问题,因此您可能需要对结果数字进行一些额外的格式化。此外,您还必须添加
fo:inline
来为参考中的第五级步骤的数字加下划线,但是由于整个链接都加了下划线,因此您永远看不到它

这是我所想的一个例子。这只处理引用,仅用于说明目的

XML输入(在底部添加了其他参考)


移除组件XYZ。
这是第二级程序步骤。
这是第三级程序步骤。
这是第四级程序步骤。
这是第五级程序步骤。
这是第二,第二级程序步骤。
以下子步骤包含数量数据。
将支架放置在机架上,并用螺栓和垫圈固定。将螺栓拧紧至
10
15
.
这是一个涉及程序中另一个步骤的段落。
这是一个涉及程序中另一个步骤的段落。
这是一个涉及程序中另一个步骤的段落。
这是一个涉及程序中另一个步骤的段落。
这是一个涉及程序中另一个步骤的段落。
这是一个涉及程序中另一个步骤的段落。
这是一个涉及程序中另一个步骤的段落。
XSLT2.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="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="internalRef[@internalRefTargetType='step']">
        <xsl:variable name="refId" select="@internalRefId"/>
        <fo:inline>
            <fo:basic-link internal-destination="{$refId}" color="blue" 
                text-decoration="underline">
                <xsl:text>Step </xsl:text> 
                <xsl:apply-templates select="//proceduralStep[@id=$refId]" mode="nbr"/>
            </fo:basic-link>
        </fo:inline>    
    </xsl:template>

    <xsl:template match="proceduralStep" mode="nbr">
        <xsl:variable name="origNbr">
            <xsl:number level="multiple" format="1.a.1.a.1"/>            
        </xsl:variable>
        <xsl:for-each select="tokenize($origNbr,'\.')">
            <xsl:value-of select="if (position()=(3,4)) then concat('(',.,')') 
                else if (position()=5) then . else concat(.,'.')"/>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
XML输出

<mainProcedure>
   <proceduralStep id="S0001">
      <para id="P0001">REMOVE COMPONENT XYZ.</para>
      <proceduralStep id="S0002">
         <para id="P0002">This is a second level procedural step.</para>
         <proceduralStep id="S0003">
            <para id="P0003">This is a third level procedural step.</para>
            <proceduralStep id="S0004">
               <para id="P0004">This is a fourth level procedural step.</para>
               <proceduralStep id="S0006">
                  <para id="P0006">This is a fifth level procedural step.</para>
               </proceduralStep>
            </proceduralStep>
         </proceduralStep>
      </proceduralStep>
      <proceduralStep id="S0005">
         <para id="P0005">This is a second, second level procedural step.</para>
      </proceduralStep>
      <proceduralStep id="S0008">
         <para id="P0008">The following sub-step has quantity data included.</para>
         <proceduralStep id="S0009">
            <para>Position bracket on frame and secure with bolts and washers. <emphasis>TORQUE BOLT TO <quantity>
                     <quantityGroup quantityGroupType="minimum" quantityUnitOfMeasure="ft.lbf">
                        <quantityValue>10</quantityValue>
                     </quantityGroup>
                     <quantityGroup quantityGroupType="maximum" quantityUnitOfMeasure="ft.lbf">
                        <quantityValue>15</quantityValue>
                     </quantityGroup>
                  </quantity>
               </emphasis>.</para>
         </proceduralStep>
      </proceduralStep>
      <proceduralStep id="S0007">
         <para id="P0007">This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0008"
                              color="blue"
                              text-decoration="underline">Step 1.c.</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0001"
                              color="blue"
                              text-decoration="underline">Step 1.</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0002"
                              color="blue"
                              text-decoration="underline">Step 1.a.</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0003"
                              color="blue"
                              text-decoration="underline">Step 1.a.(1)</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0004"
                              color="blue"
                              text-decoration="underline">Step 1.a.(1)(a)</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0005"
                              color="blue"
                              text-decoration="underline">Step 1.b.</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0006"
                              color="blue"
                              text-decoration="underline">Step 1.a.(1)(a)1</fo:basic-link>
            </fo:inline> in the procedure.</para>
      </proceduralStep>
   </proceduralStep>
</mainProcedure>

移除组件XYZ。
这是第二级程序步骤。
这是第三级程序步骤。
这是第四级程序步骤。
这是第五级程序步骤。
这是第二,第二级程序步骤。
以下子步骤包含数量数据。
将支架放置在机架上,并用螺栓和垫圈固定。将螺栓拧紧至
10
15
.
这是一段提到
步骤1.c。
在程序中。
这是一段提到
第一步。
在程序中。
这是一段提到
步骤1.a。
在程序中。
这是一段提到
步骤1.a.(1)
在程序中。
这是一段提到
步骤1.a.(1)(a)
在程序中。
这是一段提到
步骤1.b。
在程序中。
这是一段提到
步骤1.a.(1)(a)1
在程序中。

XSLT的哪个版本?另外,如果它是对第三级步骤的引用,引用是否会显示
1.a.(1)
1
<mainProcedure>
   <proceduralStep id="S0001">
      <para id="P0001">REMOVE COMPONENT XYZ.</para>
      <proceduralStep id="S0002">
         <para id="P0002">This is a second level procedural step.</para>
         <proceduralStep id="S0003">
            <para id="P0003">This is a third level procedural step.</para>
            <proceduralStep id="S0004">
               <para id="P0004">This is a fourth level procedural step.</para>
               <proceduralStep id="S0006">
                  <para id="P0006">This is a fifth level procedural step.</para>
               </proceduralStep>
            </proceduralStep>
         </proceduralStep>
      </proceduralStep>
      <proceduralStep id="S0005">
         <para id="P0005">This is a second, second level procedural step.</para>
      </proceduralStep>
      <proceduralStep id="S0008">
         <para id="P0008">The following sub-step has quantity data included.</para>
         <proceduralStep id="S0009">
            <para>Position bracket on frame and secure with bolts and washers. <emphasis>TORQUE BOLT TO <quantity>
                     <quantityGroup quantityGroupType="minimum" quantityUnitOfMeasure="ft.lbf">
                        <quantityValue>10</quantityValue>
                     </quantityGroup>
                     <quantityGroup quantityGroupType="maximum" quantityUnitOfMeasure="ft.lbf">
                        <quantityValue>15</quantityValue>
                     </quantityGroup>
                  </quantity>
               </emphasis>.</para>
         </proceduralStep>
      </proceduralStep>
      <proceduralStep id="S0007">
         <para id="P0007">This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0008"
                              color="blue"
                              text-decoration="underline">Step 1.c.</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0001"
                              color="blue"
                              text-decoration="underline">Step 1.</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0002"
                              color="blue"
                              text-decoration="underline">Step 1.a.</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0003"
                              color="blue"
                              text-decoration="underline">Step 1.a.(1)</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0004"
                              color="blue"
                              text-decoration="underline">Step 1.a.(1)(a)</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0005"
                              color="blue"
                              text-decoration="underline">Step 1.b.</fo:basic-link>
            </fo:inline> in the procedure.</para>
         <para>This is a para with a reference to <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format">
               <fo:basic-link internal-destination="S0006"
                              color="blue"
                              text-decoration="underline">Step 1.a.(1)(a)1</fo:basic-link>
            </fo:inline> in the procedure.</para>
      </proceduralStep>
   </proceduralStep>
</mainProcedure>