Нумерация абзацев XSL-FO в ссылке
Я создаю PDF-файлы формата S1000D xml и мне нужно отобразить ссылку на другой шаг с указанием номера шага / буквенного обозначения. На изображении ниже показано то, что в настоящее время показано в виде ссылки на 1.d. следует прочитать 1.c.
Исходный 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>
Любая помощь, направленная на правильный путь, очень ценится.
1 ответ
Я думаю ты делаешь xsl:number
слишком сложно. Вы должны быть в состоянии использовать только один xsl:number
и устранить xsl:if
х (делая xsl:apply-templates
и с использованием измененного шаблона).
Тем не менее, я столкнулся с проблемами с Parens в format
атрибута, так что вам может потребоваться выполнить дополнительное форматирование для полученного числа. Кроме того, вы должны добавить fo:inline
подчеркнуть номер для шага 5-го уровня в ссылке, но так как вся ссылка подчеркнута, вы никогда не увидите ее.
Вот пример того, о чем я думал. Это только обрабатывает ссылки и только для иллюстрации.
XML Input (добавлены дополнительные ссылки внизу)
<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>