2016-03-15 1 views
2

У меня есть этот кусок кода, модифицированного из DITA-OT исходного распределения:Преобразование XSL: Наносить-шаблоны в строковое значение для использования в качестве, если параметр

<xsl:template match="*[contains(@class, ' topic/topic ')]" mode="in-this-section-chapter-list"> 
    <fo:block margin-left="6em"> 
     <fo:block> 
      <xsl:call-template name="insertVariable"> 
       <xsl:with-param name="theVariableID" select="'Chapter with number'"/> 
       <xsl:with-param name="theParameters"> 
        <number> 
         <fo:inline> 
          <xsl:apply-templates select="key('map-id', @id)[1]" 
           mode="topicTitleNumber"/> 
         </fo:inline> 
        </number> 
       </xsl:with-param> 
      </xsl:call-template> 
     </fo:block> 
    </fo:block> 
</xsl:template> 

Я пытаюсь выполнить только/печатать эту мини-TOC, когда это Часть, которая имеет главы, как дочерние узлы (смотри ниже), но не тогда, когда это только Часть без глав, в книге, как это:

<?xml version="1.0" encoding="utf-8"?> 
<bookmap> 
<part> 
    <chapter/> 
    <chapter/> 
    <chapter/> 
</part> 
<part/> 
<part/> 
<part/> 
<part/> 
<appendix/> 
</bookmap> 

Так что в этом случае только первая < часть > выполнит/распечатает.

Я думал, что передавая значение от < XSL: Наносить-шаблоны выберите "ключ ('карта-идентификатор', @Id) [1]" = режим = "topicTitleNumber"/> как текст, позволит мне чтобы добавить , если, который в основном будет проверять значение, которое не пустое, тем самым выполняя это. Но это не сработало.

я придумал что-то вроде этого, которое не является действительным:

<xsl:template match="*[contains(@class, ' topic/topic ')]" mode="in-this-section-chapter-list"> 

<xsl:with-param name="value-number"> 
    <xsl:apply-templates select="key('map-id', @id)[1]" 
     mode="topicTitleNumber"/> 
</xsl:with-param> 

<xsl:if test="$value-number!=''"> 
    <fo:block margin-left="6em"> 
     <fo:block> 
      <xsl:call-template name="insertVariable"> 
       <xsl:with-param name="theVariableID" select="'Chapter with number'"/> 
       <xsl:with-param name="theParameters"> 
        <number> 
         <fo:inline> 
          <xsl:apply-templates select="key('map-id', @id)[1]" 
           mode="topicTitleNumber"/> 
         </fo:inline> 
        </number> 
       </xsl:with-param> 
      </xsl:call-template> 
     </fo:block> 
    </fo:block> 
</xsl:if> 
</xsl:template> 
+1

Чтобы сказать что-то ей, требуется хотя бы объявление ключа для идентификатора карты и используемого шаблона с 'mode =" topicTitleNumber "'. Предполагалось, что этот шаблон генерирует некоторый xml. Чем вы не можете использовать это как текст без расширения xslt. –

ответ

2

Для шаблона, чтобы соответствовать только part, которые содержат chapter, изменить match="*[contains(@class, ' topic/topic ')]" к match="part[chapter][contains(@class, ' topic/topic ')]". не

Вы можете больше не нужен [contains(@class, ' topic/topic ')], если предикат будет истинным для каждого part, что вас интересует. И вы действительно не хотите его, если он будет ложным для любого из part, что вы

0

Возможно, вам также потребуется добавить OR, чтобы вы могли выбрать главу, если вы хотите, чтобы минитот находился на уровне главы.

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