2009-09-22 2 views
0

В XSLT 2.0 есть простой способ заменить названные заполнители в строке?Строковые подстановки XSLT

Я имею в виду что-то вроде string.Template Python, где вы можете сделать это:

d = dict(name='Joe', age='50') 
print Template("My name is $name and my age is $age").substitute(d) 

Дело в том, экстернализовать строку, поэтому она может быть легко изменена. Единственный способ, который я нашел до сих пор, - использовать названный xsl: template с параметрами, но это довольно многословно. Есть ли более простой способ?

+0

Ваш вопрос непонятен. Вам нужен автоматизированный механизм, который будет искать токены в форме, например $ name, lookup «name» в таблице значений замещения и заменить значение $ name значением? В определенных текстовых узлах? Во всем мире? –

+0

Я ищу что-то, что я могу назвать, передавая ему определенную строку и набор параметров. –

ответ

1

Я закончил тем, что делал что-то вроде этого:

<!-- Reusable template to perform substitutions on a string --> 
<xsl:template name="substitutions"> 
    <!-- "string" is a string with placeholders surrounded by {} --> 
    <xsl:param name="string" /> 
    <!-- "subs" is a list of nodes whose "key" attributes are the placeholders --> 
    <xsl:param name="subs" /> 
    <xsl:analyze-string select="$string" regex="\{{(.*?)\}}"> 
     <xsl:matching-substring> 
      <xsl:value-of select="$subs/sub[@key=regex-group(1)]" /> 
     </xsl:matching-substring> 
     <xsl:non-matching-substring> 
      <xsl:value-of select="." /> 
     </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 

<!-- Example use of template --> 
<xsl:variable name="nameStr">My name is {name} and my age is {age}</xsl:variable> 
<xsl:call-template name="substitutions"> 
    <xsl:with-param name="string" select="$nameStr" /> 
    <xsl:with-param name="subs"> 
     <sub key="name">Joe</sub> 
     <sub key="age">50</sub> 
    </xsl:with-param> 
</xsl:call-template> 

Я должен был использовать атрибуты для имен замещения, а не просто проходя узлы с разными именами (например, < имени > Джо </именем >). XPath (или, по крайней мере, Saxon, процессор, который я использую), похоже, не позволяет динамические выражения типа «$ subs/regex-group (1)». Но он позволяет «$ subs/sub [@ key = regex-group (1)]».

1

Не существует высокоуровневой функции для порядка строковых шаблонов Python, но вы можете сделать что-то подобное с помощью xsl: analysis-string, что позволит обрабатывать регулярный анализ строки за кусок за раз , Если вы хотите, чтобы репликации были ориентированы на таблицы, вы могли бы настроить xsl: ключ для хранения сопоставления и написать функцию xsl: для выполнения замены на произвольной строке.

Не самая легкая вещь в мире, но, безусловно, выполнимая и многоразовая позже, если все сделано правильно.

+0

Хорошая идея использовать аналитическую строку - см. Мое решение, размещенное как отдельный ответ. –

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