РЕДАКТИРОВАТЬ 1
Я только что понял, что версия Димитра использует рекурсию и очень похожа; поэтому мое первое предложение кажется глупым.
Вот версия, которая использует рекурсию:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="fld-beg" select="'[['"/>
<xsl:variable name="fld-end" select="']]'"/>
<xsl:variable name="replacement" select="'F'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="source/text()">
<xsl:call-template name="replace">
<xsl:with-param name="str" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="replace">
<xsl:param name="str"/>
<xsl:choose>
<xsl:when test="contains($str, $fld-beg) and contains($str, $fld-end)">
<xsl:call-template name="replace">
<xsl:with-param name="str" select="concat(
substring-before($str, $fld-beg),
$replacement,
substring-after($str, $fld-end))"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$str"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
match="source/text()"
сопоставляет весь текст в узле «источник» как одну строку и передает его в именованный шаблон «заменить». «replace» ищет вхождения начального и конечного разделителей ('[[' и ']]'), и, если найден, разбивает текст на (и, следовательно, игнорирует) разделители, вставляет строку замены и передает все это себе повторить процесс.
Я говорю «сплит», но, учитывая отсутствие реального split()
в XPath 1.0, мы можем получить, объединившись substring-before()
и substring-after()
.
Учитывая текст в источнике, 'abc [[field1]] def [[field2]] ghi'
, рекурсия выглядит следующим образом, показывая, как она разбивается, заменяется и передается:
'abc ' + 'F' + def [[field2]] ghi'
, снова передан в 'замену'
'abc F def ' + 'F' + ' ghi'
, снова передан в «замену»
- , поскольку разделители отсутствуют,
'abc F def F ghi'
передается обратно до match="source/text()"
Вот как это выглядит с xsltproc
:
$ xsltproc so.xsl so.xml
<?xml version="1.0"?>
<xliff xmlns:xliff="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
<file>
<source>abc F def F ghi</source>
</file>
</xliff>
Надеюсь, это поможет.