XSL Использование замены и совпадений для обновления значений - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь обновить старую форму, в которой используется измененная модель данных, поэтому любую ссылку на старую модель я хочу заменить новой.В настоящее время я использую функцию соответствует , чтобы сказать, должен ли я предварительно выполнить замену текущей строки, а затем использовать функцию replace для замены значения новым, проблема в том, чтоРегулярное выражение, используемое в совпадениях , не работает с регулярным выражением в replace .

 <xsl:template
    match="//*[contains(@*:default,'instance(''document'')/')
    mode="pass">

    <xsl:variable
        name="regex"
        as="element()*">
        <regex>instance('document')/doc_type/description</regex>
        <regex>anotherRegex</regex>
    </xsl:variable>

    <xsl:variable
        name="replacement"
        as="element()*">
        <replacement>xxf:get-request-parameter('documentDesc')</replacement>
        <replacement>replacedRegex</replacement>
    </xsl:variable>

    <xsl:element name="{name()}">
        <xsl:for-each select="@*">
            <xsl:choose>
                <xsl:when test="name() = ('xxf:default')">
                    <xsl:attribute name="xxf:default">
                        <xsl:analyze-string
                        regex="{concat('(',$regex[1],'|',$regex[2],')')}"
                        select=".">
                            <xsl:matching-substring>
                                <xsl:if test="matches(.,$regex[1])">
                                    <xsl:value-of select="replace(.,$regex[1],$replacement[1])" />
                                </xsl:if>
                                <xsl:if test="matches(.,$regex[2])">
                                    <xsl:value-of select="replace(.,$regex[2],$replacement[2])" />
                                </xsl:if>
                            </xsl:matching-substring>
                            <xsl:non-matching-substring>
                                <xsl:value-of select="." />
                            </xsl:non-matching-substring>
                        </xsl:analyze-string>
                    </xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:attribute name="{local-name()}"><xsl:value-of select="." /></xsl:attribute>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:element>
</xsl:template>

Текущий XML:

<xf:bind id="clinic-bind"
    name="clinic"
    xxf:default="instance('document')/doc_type/description"
    type="xf:string"/>

Во что я хочу превратить это:

<xf:bind id="clinic-bind"
    name="clinic"
    xxf:default="xxf:get-request-parameter('documentDesc')"
    type="xf:string"/>

1 Ответ

0 голосов
/ 22 января 2019

Таким образом, проблема была в основном, мне пришлось экранировать символы '()' в переменной regex.

Итак, я закончил с

<regex>instance\('document'\)/doc_type/description</regex>

В регулярном выражении.

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