Конкатенация с экранированными символами в xslt? - PullRequest
1 голос
/ 23 февраля 2011

Я пишу код xslt, который объединяет некоторую строку:

<xsl:attribute name='src'>
    <xsl:value-of select="concat('url(&apos;', $imgSrc, '&apos;)')" />
</xsl:attribute>

По какой-то причине я не могу его использовать, я получаю эту ошибку:

Unknown function - Name and number of arguments do not match any function signature in the static context - 'http://www.w3.org/2005/xpath-functions:concat'

while evaluating the expression: select="concat('url(&apos;', $imgSrc, '&apos;)')"

Есть идеи?

ТНХ

====================

EDIT

Я пытаюсь получить:

url('some_path')

Были проблемы с апострофами, но теперь это просто не работает.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Ссылки &apos; разрешаются анализатором XML, который анализирует ваш XSLT. Ваш XSLT-процессор никогда их не видит. То, что видит ваш XSLT-процессор:

concat('url('', $imgSrc, '')') 

Что недопустимо, потому что запятые не попадают в нужное место для разделения аргументов. Однако это может работать для вас, в зависимости от сериализатора , который использует ваш процессор XSLT:

concat(&quot;url('&quot;, $imgSrc, &quot;')&quot;)

Это заключает аргументы в двойные кавычки, чтобы ваши одинарные кавычки не конфликтовали. Процессор XSLT должен увидеть это:

concat("url('", $imgSrc, "')")

Другой вариант - определить переменную:

<xsl:variable name="apos" select='"&apos;"'/>

Что можно использовать так:

 concat('url(', $apos, $imgSrc, $apos, ')')

Подробнее здесь :

Когда вы применяете таблицу стилей XSLT к документ, если объекты объявлены и упоминается в этом документе, ваш XSLT процессор даже не узнает о них. XSLT-процессор оставляет работу парсинг входного документа (чтение его и выяснить, что к чему) Анализатор XML; вот почему установка некоторых процессоров XSLT требует от вас идентифицировать XML Парсер вы хотите их использовать. (Другие включить синтаксический анализатор XML как часть их установка.) Важная часть Работа парсера XML состоит в том, чтобы решить все ссылки на сущности, так что если DTD входного документа объявляет cpdate юридическое лицо, имеющее значение "2001" и документ имеет строку "авторское право" & Cpdate; все права защищены ", XML парсер пройдет по текстовому узлу "Copyright 2001 Все права защищены" поместить в исходное дерево XSLT.

2 голосов
/ 23 февраля 2011

С http://www.w3.org/TR/xpath/#NT-Literal

[29]    Literal    ::=    '"' [^"]* '"'  |  "'" [^']* "'" 

Это означает, что строковое значение XPath не может содержать разделитель как часть содержимого.

Для этого вы должны использовать язык хоста. В XSLT:

<xsl:variable name="$vPrefix">url('</xsl:variable>
<xsl:variable name="$vSufix">')</xsl:variable>
<xsl:attribute name="src">
     <xsl:value-of select="concat($vPrefix, $imgSrc, $vSufix)" />
</xsl:attribute> 

Или точнее:

<xsl:attribute name="src">
     <xsl:text>url('</xsl:text>
     <xsl:value-of select="$imgSrc"/>
     <xsl:text>')</xsl:text>
</xsl:attribute> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...