2014-11-14 1 views
1

Я создаю PDF-файлы из S1000D xml и вам нужно отобразить ссылку на другой шаг, указав номер шага номер/букву. На рисунке ниже показано, что в настоящее время отображается как ссылка на 1.d. следует читать 1.c.XSL-FO Нумерация абзаца в ссылке

Current output

Источник 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> 

Вот XSL У меня есть, что дает мне неправильный номер/письмо комбо. Похоже, что дает мне номер для шага, который содержит ссылку (есть еще один шаблон, который обрабатывает данные <quantity>:.

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

Любая помощь в получении меня на правильный путь очень ценится

+0

Какая версия XSLT? –

+0

Кроме того, если бы это была ссылка на шаг 3-го уровня, отображался ли эталонный дисплей '1.a. (1)' или '1.a.1.'? Как насчет ссылки на 5-й уровень? –

+0

@ DanielHaley Я использую XSLT 2.0, а порядок равен 1.a. (1) (a) 1. Последнее 1 подчеркнуто. Поэтому, если я ссылаюсь на шаг, необходимо создать индикаторы уровня соответствия, а «Шаг» - до нумерации. – twfurst

ответ

2

I думаю, что вы делаете xsl:number слишком сложными. вы должны быть в состоянии использовать только один xsl:number и устранить xsl:if «S (путем делать xsl:apply-templates и используя шаблон перебора режимов).

Однако, я столкнулся с проблемами с скобками в атрибуте format e, поэтому вам, возможно, придется сделать некоторое дополнительное форматирование к полученному числу. Кроме того, вам нужно будет добавить fo:inline, чтобы подчеркнуть номер шага 5-го уровня в ссылке, но так как вся ссылка подчеркнута, вы никогда ее не увидите.

Вот пример того, что я думал. Это относится только к ссылкам и предназначено только для иллюстрации.

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> 
      <para>This is a para with a reference to <internalRef 
       internalRefId="S0001" internalRefTargetType="step"> another step</internalRef 
       > in the procedure.</para> 
      <para>This is a para with a reference to <internalRef 
       internalRefId="S0002" internalRefTargetType="step"> another step</internalRef 
       > in the procedure.</para> 
      <para>This is a para with a reference to <internalRef 
       internalRefId="S0003" internalRefTargetType="step"> another step</internalRef 
       > in the procedure.</para> 
      <para>This is a para with a reference to <internalRef 
       internalRefId="S0004" internalRefTargetType="step"> another step</internalRef 
       > in the procedure.</para> 
      <para>This is a para with a reference to <internalRef 
       internalRefId="S0005" internalRefTargetType="step"> another step</internalRef 
       > in the procedure.</para> 
      <para>This is a para with a reference to <internalRef 
       internalRefId="S0006" internalRefTargetType="step"> another step</internalRef 
       > in the procedure.</para> 

     </proceduralStep> 
    </proceduralStep> 
</mainProcedure> 

XSLT 2,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> 
+0

, что в два раза у вас есть ответ для меня. Я определенно делал '' сложнее, чем нужно было на основе этого примера. Конечно, будет пересмотр некоторых других XSL в этом проекте, который использует нумерацию. – twfurst

+0

@twfurst - Рад, что я мог бы помочь. Я работал с S1000D несколько и много, если iSpec 2200, поэтому, если вы когда-нибудь захотите поговорить о чем-либо вне Stackoverflow, не стесняйтесь присылать мне электронное письмо. –

+0

спасибо за расширение предложения, хороший шанс, что я ударил вас в какой-то момент, чтобы отбросить вас от вас. – twfurst

 Смежные вопросы

  • Нет связанных вопросов^_^