Проблемы пути изображения XSL-FO - изменение обратной косой черты на прямую - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть следующий фрагмент кода abc.xml.

<abc>Images\Image.JPG</abc>

, и я хочу отобразить это изображение в PDF.Я использую Apache FOP для перевода моего XML в PDF с использованием XSL-FO.К сожалению, я не могу найти умный способ заменить обратную косую черту как прямую косую черту.Вот некоторый xsl-код, с которым я играю:

<fo:external-graphic> <xsl:variable name="fixTest">file:///<xsl:value-of select="abc"/> <xsl:attribute name="src" select="'{translate(@fixTest, '\','/')}'"/> </fo:external-graphic>

У меня также есть код, который я пытался использовать безрезультатно.Теперь я знаю, как только я пойму, как заменить '\' на '/' файлом XSL-FO, я смогу отобразить свое изображение.Однако сейчас я не могу понять, как это сделать.

<xsl:attribute name="src"><xsl:value-of select="concat('file:///',translate(@abc, '\', '/'))"/></xsl:attribute>

Кто-нибудь знает, как я могу перевести '\' в '/' в моем текстовом значении элемента abc, поэтому я также могу объединить file:/// с этим значением и установить его в качестве моего src атрибута для fo:external-graphic?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Это было слишком долго, чтобы писать в комментариях, но в своем вопросе вы показываете, что делаете это ...

<xsl:attribute name="src" select="'{translate(@fixTest, '\','/')}'"/>

(Хотя, как вы показали, это действительно должно быть. здесь, а не @fixTest)

Но это означает, что у вас есть апострофы, вложенные в строку, ограниченную апострофами, что является синтаксической ошибкой.Итак, вы должны были написать это, чтобы сделать его синтаксически правильным.

<xsl:attribute name="src" select="'{translate(@fixTest, &quot;\&quot;,&quot;/&quot;)}'"/> 

Но это показало бы вам, в чем проблема.select ожидает выражения.Используя разделение выражения апострофами, вы превратили его в строковый литерал, чтобы выражение не оценивалось.Но вам не нужно было использовать апострофы или фигурные скобки здесь.Вы должны были написать это ....

<xsl:attribute name="src" select="translate(., '\', '\')"/>

Или добавить префикс "file: ///" ....

<xsl:attribute name="src" select="concat('file:///',translate(., '\', '/'))"/>

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

<fo:external-graphic src="file:///{translate(., '\', '/')}">

Здесь атрибут src ожидает строку, авместо этого для вычисления выражения используются фигурные скобки.

0 голосов
/ 13 декабря 2018

Хорошо, так что я разобрался со своей проблемой.Я не включил свой элемент <xsl:template match="abc">, потому что не думал, что это важно для моей проблемы.Так что мне нужно было использовать . для ссылки на мое собственное значение шаблона при настройке атрибута src здесь

<xsl:attribute name="src"><xsl:value-of select="concat('file:///',translate(., '\', '/'))"/></xsl:attribute>

Весь фрагмент моего кода xsl приведен ниже.

<xsl:template match="abc"> <fo:block xsl:use-attribute-sets="abc"> <fo:external-graphic> <xsl:attribute name="src"><xsl:value-of select="concat('file:///',translate(., '\', '/'))"/></xsl:attribute> </fo:external-graphic> <xsl:apply-templates/> </fo:block> </xsl:template>

...