Селектор XPath не работает во время преобразования PDF

У меня есть карта книг DITA, где я храню пути к изображениям:

<bookmap>
    <bookmeta>
        <data id="productLogo">
            <image href="images/_notrans/frontcover/productLogo.svg" />
        </data>
        <data id="productPhoto" >
            <image href="images/_notrans/frontcover/productPhoto.jpg" />
        </data>
    </bookmeta>
</bookmap>

Затем я пытаюсь получить значения href по данным [@id]:

<xsl:variable name="productLogo"><xsl:value-of select="//data[@id='productLogo']/image/@href" /></xsl:variable>
<xsl:variable name="productPhoto"><xsl:value-of select="//data[@id='productPhoto']/image/@href" /></xsl:variable> 

(Эти выражения XPath совпадают с href, когда я проверяю свою карту книг в Oxygen.)

Во время преобразования я вывожу:

<xsl:message>productPhoto: <xsl:value-of select="$productPhoto"/></xsl:message>

Значение всегда пусто.

Однако все работает, как и ожидалось, если я заменю атрибут id числами:

<xsl:variable name="productLogo"><xsl:value-of select="//data[1]/image/@href" /></xsl:variable>
<xsl:variable name="productPhoto"><xsl:value-of select="//data[2]/image/@href" /></xsl:variable> 

Что я делаю неправильно, что мешает использовать @id="whatever"?


person Matt    schedule 24.09.2013    source источник


Ответы (2)


XSLT не применяется непосредственно к содержимому Bookmap, он применяется к XML-документу, который содержит bookmap со всеми развернутыми в нем ссылками на темы и с некоторой предварительной обработкой, примененной к нему. Если вы установите для параметра «clean.temp» значение «нет», вы найдете в папке временных файлов файл с именем вроде «mapName_MERGED.xml», который представляет собой XML-документ, к которому применяется XSLT, и, как вы увидите в В нем все идентификаторы были изменены, чтобы они были уникальными в контексте всего XML-документа.

Обычно при работе с элементами данных вы должны установить для них атрибут @name, например:

<data name="productLogo">

и сопоставьте это имя в коде XSLT. В спецификациях DITA 1.2 также есть примеры использования «данных»:

http://docs.oasis-open.org/dita/v1.2/os/spec/langref/data.html#data

person Radu Coravu    schedule 25.09.2013
comment
В этом есть смысл, Раду. Использование имени вместо идентификатора отлично работает. Благодарю вас! - person Matt; 25.09.2013

Другой вариант, в зависимости от ваших потребностей, — разработать соглашение об именах для фотографий продуктов и использовать элемент для создания URI. Поскольку логотип продукта не должен меняться для семейства продуктов, не помешает жестко закодировать его в коде XSLT.

person JulioV    schedule 25.09.2013