xsl: если это зависит от дочернего узла

У меня есть эта карта книг:

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

Я хотел бы разместить внутри шаблонов команды xsl:if, которые зависят от того, являются ли элементы part/chapter или part.

т.е. У меня они были внутри шаблона processTopicTitle, входящего в дистрибутив DITA-OT:

<xsl:if test="bookmap/part/chapter">
    <fo:external-graphic src="thisischapter.png" />
</xsl:if>

<xsl:if test="bookmap/part">
    <fo:external-graphic src="thisispart.png" />
</xsl:if>

Это не работает.

Идея состоит в том, что одна графика отображается только в part/chapters, а другая — только в part.


person Jose Cotes    schedule 30.03.2016    source источник
comment
Возможно, он не работает, так как ваш контекст должен быть узлом документа, чтобы тест возвращал значение true. Вероятно, было бы полезно увидеть больше вашего XSLT, чтобы дать более полный ответ, особенно шаблон операторов, в которых находятся операторы. Не могли бы вы также отредактировать свой вопрос, чтобы показать ожидаемый результат? Спасибо.   -  person Tim C    schedule 30.03.2016
comment
Вот раздел, в который я хочу поместить бриллиант.png: ) Я пытаюсь поместить это изображение перед заголовком каждой темы, но только для тем, которые находятся только внутри part. Те, которые находятся внутри главы, не будут добавлять эту графику.   -  person Jose Cotes    schedule 31.03.2016


Ответы (2)


Что вам нужно сделать, это что-то вроде этого:

<xsl:choose>
    <!-- parts -->
    <xsl:when test="$map//*[contains(@class, ' bookmap/part ')]">
        <xsl:call-template name="getVariable">
            <xsl:with-param name="id" select="'First Cover Image Path'"/>
        </xsl:call-template>
    </xsl:when>
    <!-- chapters -->
    <xsl:when test="$map//*[contains(@class, ' bookmap/chapter ')]">
        <xsl:call-template name="getVariable">
            <xsl:with-param name="id" select="'Second Cover Image Path'"/>
        </xsl:call-template>
    </xsl:when>
    <!-- parts without chapters -->
    <xsl:when test="$map//*[contains(@class, ' bookmap/part ')][not(child::*[contains(@class, ' bookmap/chapter ')])">
        <xsl:call-template name="getVariable">
            <xsl:with-param name="id" select="'Third Cover Image Path'"/>
        </xsl:call-template>
    </xsl:when>
</xsl:choose>

Вы должны определить изображения в файлах конфигурации ~/cfg/common/vars/en.xml

Вы должны прочитать:

Обновить

Для размещения своего изображения следует использовать шаблон placeImage:

<xsl:apply-templates mode="placeImage" select=".">
    <xsl:with-param name="imageAlign" select="@align"/>
    <xsl:with-param name="href"
                    select="
                    if (@scope = 'external' or opentopic-func:isAbsolute(@href)) then
                        @href
                    else
                        concat($input.dir.url, @href)"/>
    <xsl:with-param name="height" select="@height"/>
    <xsl:with-param name="width" select="@width"/>
</xsl:apply-templates>

Полезно сгенерировать плагин с помощью dita-generator, установить собственную обложку и затем сравнить свой код. с кодом сгенерированного плагина.

person Stefan Eike    schedule 30.03.2016
comment
Большое спасибо. К сожалению, это не сработало, как ожидалось. Вот ссылка на раздел josecotes.com/tmp/sample1.txt. Прямо сейчас я добавил это, но все еще не работает: <xsl:if test="$map//*[contains(@class, ' bookmap/part ')][not(child::*[contains(@class, ' bookmap/chapter ')])"> <fo:external-graphic src="./Customization/OpenTopic/common/artwork/diamond.png" content-height="20px" scaling="uniform" /> <fo:inline>&#xA0;&#xA0;</fo:inline> </xsl:if> - person Jose Cotes; 31.03.2016
comment
Я добавил пример использования шаблона placeImage. Не могли бы вы объяснить, что не работает? - person Stefan Eike; 03.04.2016
comment
Я тестировал это дальше... в вашем первом фрагменте кода выше все они возвращают true. Запускается первый <ssl:when> в списке <xsl:choose>. Я удалил это, а затем второе было правдой и так далее. - person Jose Cotes; 07.04.2016

Я заставил это работать так:

<xsl:template name="insertDiamond">
    <xsl:variable name="topicref" select="key('map-id', ancestor-or-self::*[contains(@class,' topic/topic ')][1]/@id)"/>
    <xsl:choose>
        <xsl:when test="$topicref//ancestor-or-self::*[contains(@class, ' bookmap/part ')][not(child::*[contains(@class, ' bookmap/chapter ')])]">
            <!--Put actions here for parts without any chapters as childs-->
        </xsl:when>
        <xsl:otherwise>
            <!--Put actions here for the rest.-->
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
person Jose Cotes    schedule 08.04.2016