XSLT строковые замены - PullRequest
       9

XSLT строковые замены

0 голосов
/ 23 сентября 2009

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

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

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

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

Ответы [ 2 ]

1 голос
/ 23 сентября 2009

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

<!-- 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 голос
/ 23 сентября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...