2015-06-22 2 views
3

У меня есть следующий XML:XSLT 2.0 регулярное выражение заменить

<t>a_35345_0_234_345_666_888</t> 

Я хотел бы заменить первое вхождение числа после «_» с фиксированным числом 234. Таким образом, результат должен выглядеть следующим образом:

<t>a_234_0_234_345_666_888</t> 

Я попытался с помощью следующих, но он не работает:

<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="/"> 
    <xsl:value-of select='replace(., "(.*)_\d+_(.*)", "$1_234_$2")'/> 
    </xsl:template> 
</xsl:stylesheet> 

UPD ATE

Следующие работы для меня (спасибо @ Chris85). Просто удалите подчеркивание и добавить «? Чтобы он не жадный.

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="/"> 
    <xsl:value-of select='replace(., "(.*?)_\d+(.*)", "$1_234$2")'/> 

    </xsl:template> 
</xsl:stylesheet> 
+1

Что происходит в настоящее время? Я думаю, вам нужно сделать это не жадным '. *?'. например '' – chris85

+0

Привет @ Chris85 - спасибо, что сработало! Можно ли изменить выражение так, чтобы в конце использовалась граница слова вместо «_»? Обычная граница слова (\ b) не поддерживается в XSLT. Я использую XSLT 2.0. Спасибо! –

+0

Я не уверен, что я не работаю с XSLT часто (раз в год или меньше). Я чаще работаю с регулярными выражениями, могу ли вы описать проблему, с которой вы сталкиваетесь, и, возможно, есть еще один подход к ней? – chris85

ответ

3

Ваше регулярное выражение не/пожадничал, то .* потребляет все до последнего появления следующего символа.

Так

(. *) _ \ d + _ (. *)

укладывал

a_35345_0_234_345_666_

в $1. Затем удалили 888 и ничего не пошло в $2.

Чтобы сделать его нежирным, добавьте ? после .*. Это говорит о том, что * останавливается при первом вхождении следующего символа.

Функциональный пример:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="/"> 
    <xsl:value-of select='replace(., "(.*?)_\d+(.*)", "$1_234$2")'/> 
    </xsl:template> 
</xsl:stylesheet> 

Вот еще некоторые документы на повторение и алчности, http://www.regular-expressions.info/repeat.html.

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