символ переноса в атрибуте xslt (xsl-fo)

Думаю, это очень простой вопрос. Но хотя я создаю очень причудливое преобразование xslt, я не могу решить эту простую задачу.

Проблема в следующем: я хочу добавить атрибуты к узлам xsl-fo в зависимости от данных xml. Эти атрибуты часто содержат дефис. Как я могу добавить их с помощью преобразования xslt, где xsl: attributes не любит символ переноса.


В узле xml у меня есть два атрибута (имя и значение). Пример: name = "font_size", value = "7pt"

<Report>
  <text content="I am a text">
    <blockFormat name="font_size" value="7pt" />
  </text>
</Report>

(Я понимаю, что это не нужно, потому что вы хотите работать со стилями и т. Д.. Это просто пример с упрощенной задачей)


Теперь я хочу создать блок xsl-fo и разместить эти атрибуты в элементе блока с помощью атрибута xsl-function xsl:

<fo:block>
  <attribute name="{replace(@name,'_','-')}" select="@value" />
....
</fo:block>

цель, которую нужно достичь после трансформации

<fo:block font-size="7pt">
....
</fo:block

Он не работает, и я думаю, это потому, что в xslt я не могу поставить дефис в имени атрибута, но в атрибуте fo он необходим.

Есть ли способ использовать для этого функцию xsl: attribute?

А если нет, то какую работу вы предлагаете.

Спасибо за помощь!!!!


person B. Schure    schedule 20.04.2016    source источник
comment
Я думаю, это потому, что в xslt я не могу ставить дефис в имени атрибута Конечно, можете. Как именно это не удается? Вы получаете сообщение об ошибке? И вы уверены, что используете процессор XSLT 2.0?   -  person michael.hor257k    schedule 20.04.2016


Ответы (2)


Есть 1000 способов сделать это, вот один (я ничего не делал с вашим элементом Report):

Вход:

<Report>
    <text content="I am a text">
        <blockFormat name="font_size" value="7pt" />
    </text>
</Report>

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    version="1.0">
    <xsl:template match="Report">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text">
        <fo:block>
            <xsl:apply-templates select="blockFormat/@*"/>
            <xsl:value-of select="@content"/>
        </fo:block>
    </xsl:template>
    <xsl:template match="@name">
        <xsl:attribute name="{translate(.,'_','-')}">
            <xsl:value-of select="ancestor::blockFormat/@value"/>
        </xsl:attribute>
    </xsl:template>
    <xsl:template match="@value"/>
</xsl:stylesheet>

Вывод:

<Report>
   <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" font-size="7pt">I am a text</fo:block>
</Report>
person Kevin Brown    schedule 20.04.2016
comment
Фантастически и слишком просто для слов. Я не использовал функцию translate, и это вызвало у меня проблемы. Теперь я легко справлюсь !!! - person B. Schure; 25.04.2016

Используйте @select вместо @value:

<fo:block>
  <attribute name="{replace(@name,'_','-')}" select="@value" />
....
</fo:block>

См. https://www.w3.org/TR/xslt20/#creating-attributes < / а>

Кроме того, для использования @select вам необходимо использовать XSLT 2.0 или 3.0. Если вы используете XSLT 1.0, вам нужно будет сделать это как xsl:attribute/xsl:value-of/@select.

(Это также помогло бы понять вашу проблему, если бы вы также показали неправильный результат, который вы получали.)

person Tony Graham    schedule 20.04.2016
comment
Извините, я ошибся при вводе вопроса. Я использую «выбрать». Вы не могли знать. Проблема в том, что я получаю не неправильный результат, а сбой при преобразовании. Может быть, это только на этапе обработки xsl-fo. Я не могу это увидеть очень быстро. Постараюсь выяснить. - person B. Schure; 20.04.2016
comment
<attribute должно быть <xsl:attribute (разве это тоже опечатка?). Если проблема не в этом, то что вы создаете в качестве начального тега fo:block? - person Tony Graham; 21.04.2016