2016-04-20 4 views
0

Я думаю, что это очень простой вопрос. Но, хотя я строю очень причудливое преобразование xslt, этот простой не может быть разрешен мной.символ переноса в атрибуте xslt (xsl-fo)

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


В узле XML я получил два атрибута (имя и значение) Пример: имя = "FONT_SIZE", значение = "7PT"

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

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


Теперь я хочу сделать XSL-FO блок, и я хочу, чтобы место, что атрибуты в блоке элемента по USI нг в XSL-функции XSL: атрибут

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

цель достичь после трансформации

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

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

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

А если нет, то какой из них вы можете предложить.

Благодарим вас за помощь !!!!

+1

«* Я думаю, что это происходит потому, что в XSLT я не могу поставить дефис в имени атрибута *» Конечно, вы можете. Как именно это не удается?Вы получили сообщение об ошибке? И вы уверены, что используете процессор XSLT 2.0? –

ответ

0

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

Вход:

<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> 
+0

Фантастический и действительно слишком простой для слов. Я не использовал функцию перевода, и это вызвало у меня проблемы. Теперь я могу справиться с этим легко! –

0

Использование @select вместо @value:

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

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

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

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

+0

Извините, я ошибся при вводе вопроса. Я использую «select». Вы не могли знать. Проблема в том, что я не получаю неправильный вывод, но сбой при преобразовании. Возможно, это только на этапе обработки xsl-fo. Я не вижу этого очень быстро. Я попытаюсь это выяснить. –

+0

'<атрибут' должен быть'

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

  • Нет связанных вопросов^_^