2016-08-24 1 views
1

Учитывая этот XML:<ВКИ: основная линия связи> не создавая интерактивную ссылку XSL-FO XSLT 1.0

<figure id="fig-0011"> 
<title>Removal of Shipping Kit(s)</title> 
<graphic id="fig-0011-gra-0001" infoEntityIdent="66503-00129-A-001-01"></graphic> 
</figure> 

и

<proceduralStep><para>Remove screw (see <internalRef internalRefId="fig-0011" internalRefTargetType="irtt01"></internalRef>) 
<proceduralStep><para>Remove two screws (10) (see <internalRef internalRefId="fig-0011-gra-0001" internalRefTargetType="irtt09"></internalRef>), 

Я пытаюсь создать ссылки на цифры и графики , Ссылка на рисунке работает правильно, но ссылка на графике не является:

<fo:basic-link> 
<xsl:attribute name="internal-destination"><xsl:apply-templates select="//dmodule/identAndStatusSection/dmAddress/dmIdent/dmCode"/><xsl:value-of select="@internalRefId"/></xsl:attribute> 
<xsl:variable name="targetElement" select="local-name(key('id',@internalRefId))"/> 
<xsl:for-each select="key('id',(@internalRefId))"> 
    <xsl:choose> 
     <xsl:when test="$targetElement='graphic'"> 
      <xsl:text>Fig </xsl:text> 
      <xsl:number count="figure" from="content" level="any"/> 
     </xsl:when> 
     <xsl:when test="$targetElement='figure'"> 
      <xsl:text>Fig </xsl:text> 
      <xsl:number count="figure" from="content" level="any"/> 
     </xsl:when> 
    </xsl:choose> 
</xsl:for-each> 

Ключ:

<xsl:key name="id" match="*" use="@id"/> 

Рисунок:

<xsl:template match="figure"> 
    <xsl:apply-templates select="graphic"/>  
</xsl:template> 

<xsl:template match="figure/graphic" priority="10"> 
    <fo:block text-align="center" start-indent="0pt" color="black" keep-with-next="always"> 
     <xsl:call-template name="do-graphic"> 
      <xsl:with-param name="include-graphic" select="true()"/> 
     </xsl:call-template> 
    </fo:block> 
    <xsl:if test="position()=last()"> 
     <xsl:apply-templates select="../legend"/> 
    </xsl:if> 
    <xsl:if test="@infoEntityIdent"> 
     <fo:block text-align="right" keep-with-previous="always"> 
      <xsl:value-of select="@infoEntityIdent"/> 
     </fo:block> 
    </xsl:if> 
    <fo:block font-weight="normal" font-style="italic" text-align="center" space-before="12pt" space-after="8pt" start-indent="0pt" keep-with-previous="always"> 
     <xsl:if test="../@id"> 
      <xsl:attribute name="id"><xsl:apply-templates select="//dmodule/identAndStatusSection/dmAddress/dmIdent/dmCode"/><xsl:value-of select="../@id"/></xsl:attribute> 
     </xsl:if> 
     <xsl:text>Fig </xsl:text> 
     <xsl:number count="figure" level="any" format="1" from="content"/> 
     <xsl:apply-templates select="../title"/> 
     <xsl:variable name="numSheets" select="count(../graphic)"/> 
     <xsl:choose> 
      <xsl:when test="$numSheets>1"> 
       <xsl:text> (Sheet </xsl:text> 
       <xsl:number count="graphic" level="any" format="1" from="figure"/> 
       <xsl:text> of </xsl:text> 
       <xsl:value-of select="$numSheets"/> 
       <xsl:text>)</xsl:text> 
      </xsl:when> 
     </xsl:choose> 
    </fo:block> 

Графика:

<xsl:template match="graphic"> 
    <fo:inline-container> 
     <fo:block space-before="12pt" space-before.conditionality="retain"> 
      <xsl:call-template name="do-graphic"/> 
     </fo:block> 
    </fo:inline-container> 
</xsl:template> 

<xsl:template name="do-graphic"> 
    <xsl:param name="include-graphic" select="true()"/> 
    <xsl:variable name="content-width"> 
     <xsl:choose> 
      <xsl:when test="@reproductionWidth != ''"> 
       <xsl:value-of select="@reproductionWidth"/> 
      </xsl:when> 
      <!-- coding for reproduction scale based on clarifications in Issue 4.1 --> 
      <xsl:when test="@reproductionScale != ''"> 
       <xsl:value-of select="@reproductionScale"/> 
       <xsl:text>%</xsl:text> 
      </xsl:when> 
      <xsl:otherwise>95%</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:variable name="content-height"> 
     <xsl:choose> 
      <xsl:when test="@reproductionHeight != ''"> 
       <xsl:value-of select="@reproductionHeight"/> 
      </xsl:when> 
      <xsl:when test="@reproductionScale != ''"> 
      <xsl:value-of select="@reproductionScale"/> 
       <xsl:text>%</xsl:text> 
      </xsl:when> 
      <xsl:otherwise>95%</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:choose> 
     <xsl:when test="$include-graphic"> 
      <fo:external-graphic src="{unparsed-entity-uri(@infoEntityIdent)}" scaling="uniform" content-height="{$content-height}" content-width="{$content-width}"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <fo:inline-container display-align="center" text-align="center" block-progression-dimension="{$content-height}" inline-progression-dimension="{$content-width}" background-color="silver" color="red"> 
       <fo:block>Graphic Not Included</fo:block> 
      </fo:inline-container> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Это возвращает:

Remove two screws (10) (see Fig 2) 

который является правильным номером рисунка, но 2 не кликабельна ссылка на графику.

Шаблон dmcode создает строку. Если я удалю это из XSLT, то число цифр больше не связывается с рисунком.

Я использую XSLT 1.0. Я ценю любую помощь, спасибо.

ответ

0

Второй internalRef относится к graphic. Похоже, что ваш XSLT не копирует graphic/@id в FO в результирующем дереве. С AH Formatter и таблицы стилей, не копировать graphic/@id, я не получаю никакой связи и сообщение об ошибке:

Unresolved internal-destination: "fig-0011-gra-0001". 

Вероятно, что ваш FO форматировщик также не делает ссылку, если нет соответствия целевой ID.

Я не могу помочь вам гораздо больше, не видя xsl:key декларации (ы), шаблоны для figure и graphic, и зная, может ли graphic появляться за пределами figure.


переиздано использовать figure/@id и graphic/@id:

<xsl:key name="id" match="*" use="@id" /> 

<xsl:variable name="prefix"> 
    <xsl:apply-templates select="//dmodule/identAndStatusSection/dmAddress/dmIdent/dmCode" /> 
</xsl:variable> 

<xsl:template match="internalRef"> 
    <xsl:for-each select="key('id', @internalRefId)"> 
     <fo:basic-link internal-destination="{$prefix}{@id}"> 
      <xsl:text>Fig </xsl:text> 
      <xsl:number count="figure" from="content" level="any" /> 
     </fo:basic-link> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="figure"> 
    <fo:wrapper id="{@id}"> 
     <xsl:apply-templates select="graphic" /> 
    </fo:wrapper>  
</xsl:template> 

<xsl:template match="figure/graphic" priority="10"> 
    <fo:block text-align="center" start-indent="0pt" color="black" keep-with-next="always"> 
     <xsl:if test="@id"> 
      <xsl:attribute name="id"> 
       <xsl:value-of select="$prefix" /> 
       <xsl:value-of select="@id" /> 
      </xsl:attribute> 
     </xsl:if> 
     <xsl:call-template name="do-graphic"> 
      <xsl:with-param name="include-graphic" select="true()" /> 
     </xsl:call-template> 
    </fo:block> 
    <xsl:if test="position() = last()"> 
     <xsl:apply-templates select="../legend" /> 
    </xsl:if> 
    <xsl:if test="@infoEntityIdent"> 
     <fo:block text-align="right" keep-with-previous="always"> 
      <xsl:value-of select="@infoEntityIdent" /> 
     </fo:block> 
    </xsl:if> 
    <fo:block font-weight="normal" font-style="italic" text-align="center" space-before="12pt" space-after="8pt" start-indent="0pt" keep-with-previous="always"> 
     <xsl:text>Fig </xsl:text> 
     <xsl:number count="figure" level="any" format="1" from="content" /> 
     <xsl:apply-templates select="../title" /> 
     <xsl:variable name="numSheets" select="count(../graphic)" /> 
     <xsl:choose> 
      <xsl:when test="$numSheets > 1"> 
       <xsl:text> (Sheet </xsl:text> 
       <xsl:number count="graphic" level="any" format="1" from="figure" /> 
       <xsl:text> of </xsl:text> 
       <xsl:value-of select="$numSheets" /> 
       <xsl:text>)</xsl:text> 
      </xsl:when> 
     </xsl:choose> 
    </fo:block> 
</xsl:template> 

Я также переехал идентификатор графического объекта к первому fo:block в figure/graphic шаблоне. Если бы это было на последнем fo:block, это означало бы прокрутку вверх, чтобы видеть графику каждый раз, когда вы следили за ссылкой на графику.

+0

Спасибо, Тони.'Graphic' не может быть за пределами' figure'. – Caroline

+0

Я ценю ваше время, Тони. Я получил это, чтобы работать с вашими предложениями, однако часто на графике фигурирует более одного графика, и, как и ожидалось, ссылка всегда идет на первую цифру. Существуют и другие элементы с идентификаторами, например 'table', поэтому я добавил' 'в объявления' xsl: key', и это сработало. Ваше решение - это улучшение по сравнению с тем, что у меня было. Мой форматировщик - Antenna House 6.2. – Caroline

+0

Спасибо, Тони, я получил графическую ссылку для работы с вашим пересмотренным кодом. Поддержка AH указала, что мне нужно добавить '' to '', который было немного проще реализовать. Я благодарен за ваши усилия. – Caroline

0

Было предложено добавить <xsl:attribute name="id"> к <fo:external-graphic> в сделай-графический шаблон и который, кажется, решить эту проблему:

<xsl:template name="do-graphic"> 
    <xsl:param name="include-graphic" select="true()"/> 
    <xsl:variable name="content-width"> 
     <xsl:choose> 
      <xsl:when test="@reproductionWidth != ''"> 
       <xsl:value-of select="@reproductionWidth"/> 
       <xsl:call-template name="checkForUom"> 
        <xsl:with-param name="measure" select="@reproductionWidth"/> 
       </xsl:call-template> 
      </xsl:when> 
      <!-- coding for reproduction scale based on clarifications in Issue 4.1 --> 
      <xsl:when test="@reproductionScale != ''"> 
       <xsl:value-of select="@reproductionScale"/> 
       <xsl:text>%</xsl:text> 
      </xsl:when> 
      <xsl:otherwise>95%</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:variable name="content-height"> 
     <xsl:choose> 
      <xsl:when test="@reproductionHeight != ''"> 
       <xsl:value-of select="@reproductionHeight"/> 
       <xsl:call-template name="checkForUom"> 
        <xsl:with-param name="measure" select="@reproductionWidth"/> 
       </xsl:call-template> 
      </xsl:when> 
      <!-- coding for reproduction scale based on clarifications in Issue 4.1 --> 
      <xsl:when test="@reproductionScale != ''"> 
       <xsl:value-of select="@reproductionScale"/> 
       <xsl:text>%</xsl:text> 
      </xsl:when> 
      <xsl:otherwise>95%</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:choose> 
     <xsl:when test="$include-graphic"> 
      <fo:external-graphic src="{unparsed-entity-uri(@infoEntityIdent)}" scaling="uniform" content-height="{$content-height}" content-width="{$content-width}"> 
      <xsl:attribute name="id"><xsl:apply-templates select="//dmodule/identAndStatusSection/dmAddress/dmIdent/dmCode"/><xsl:value-of select="@id"/></xsl:attribute> 
      </fo:external-graphic> 
     </xsl:when> 
     <xsl:otherwise> 
      <fo:inline-container display-align="center" text-align="center" block-progression-dimension="{$content-height}" inline-progression-dimension="{$content-width}" background-color="silver" color="red"> 
       <fo:block>Graphic Not Included</fo:block> 
      </fo:inline-container> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template>