Замените {myParameter} на его значение в строке

Мне интересно, как легко разрешить {myParameterX} по его значению в строке.

У меня есть раздел в моем xml (очевидно, упрощенный для поста), который содержит определения параметров и набор строк для «перевода»:

<section>
    <parameters>
        <myParameter1>One</myParameter1>
        <myParameter2>Two</myParameter2>
    </parameters>
    <field toTranslate="{myParameter1} + {myParameter1} = {myParameter2}"/>
    <field toTranslate="{myParameter2} - {myParameter1} = {myParameter1}"/>
</section>

В конце я ожидаю что-то вроде:

<field translated="One + One = Two"/>
<field translated="Two - One = One"/>

Я думаю, что решение близко, но я продолжаю получать неприятную ошибку о недопустимых символах в моем регулярном выражении (Unexpected token ")" in path expression). Я пытался сбежать и сбежать от escape-символов, но не могу этого добиться :(

<xsl:template name="resolve">
    <xsl:param name="toResolve" as="xs:string"/>
    <xsl:param name="parameters" as="element()"/>

    <xsl:analyze-string regex="{(.+)}" select="$toResolve">
        <xsl:matching-substring>
            <xsl:variable name="pName" select="regex-group(1)"/>
            <xsl:value-of select="$parameters/$pName"/>
        </xsl:matching-substring>
    </xsl:analyze-string>
</xsl:template>

<xsl:call-template name="resolve">
    <xsl:with-param name="toResolve" select="field/@toTranslate"/>
    <xsl:with-param name="parameters" select="parameters"/>
</xsl:call-template>

Обратите внимание, я использую xslt 2.0 Есть идеи?


person poussma    schedule 30.05.2013    source источник


Ответы (1)


Попробуйте <xsl:analyze-string regex="\{{(.+?)\}}" select="$toResolve">.

Вот полный образец:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* , node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="field/@toTranslate">
  <xsl:variable name="field" select=".."/>
  <xsl:attribute name="translated">
    <xsl:analyze-string regex="\{{(.+?)\}}" select=".">
        <xsl:matching-substring>
            <xsl:variable name="pName" select="regex-group(1)"/>
            <xsl:value-of select="$field/../parameters/*[local-name() eq $pName]"/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
           <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
  </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

Превращает

<section>
    <parameters>
        <myParameter1>One</myParameter1>
        <myParameter2>Two</myParameter2>
    </parameters>
    <field toTranslate="{myParameter1} + {myParameter1} = {myParameter2}"/>
    <field toTranslate="{myParameter2} - {myParameter1} = {myParameter1}"/>
</section>

в

<?xml version="1.0" encoding="UTF-8"?><section>
    <parameters>
        <myParameter1>One</myParameter1>
        <myParameter2>Two</myParameter2>
    </parameters>
    <field translated="One + One = Two"/>
    <field translated="Two - One = One"/>
</section>
person Martin Honnen    schedule 30.05.2013
comment
Спасибо! Где я могу найти способ правильно избежать регулярного выражения в xsl? - person poussma; 30.05.2013
comment
Вы просите документ? Или функция для побега? Есть две проблемы: атрибут regex позволяет использовать шаблоны значений атрибутов (синтаксис XSLT), поэтому фигурные скобки { и } необходимо дублировать для буквальной интерпретации, а внутри шаблона регулярного выражения фигурные скобки используются для разграничения квантификатора (например, a{5,10} соответствует от 5 до 10 a символов), поэтому для того, чтобы регулярное выражение обрабатывало фигурные скобки буквально, нам нужно \{ соответственно ``}. Together that results in regex=\{{(.+?)\}}`. - person Martin Honnen; 30.05.2013
comment
Что касается функции, которая экранирует { как \{, см. xsltfunctions.com/xsl. /functx_escape-for-regex.html. - person Martin Honnen; 30.05.2013
comment
хорошо, спасибо, я пропустил первую часть вашего объяснения (дублируйте фигурные скобки). спасибо - person poussma; 30.05.2013