РЕДАКТИРОВАТЬ: [это началось с замены персонажа, и я закончил с обнаружением замены строки с помощью Dimitre Novatchev и Roland Bouman
Я думаю, что примеры кодов достаточны для объяснения требований ..
Это пример XML:
<root>
<node1>text node</node1>
<node2>space between the text</node2>
<node3> has to be replaced with $</node3>
</root>
Это ожидаемый результат:
<root>
<node1>text$node</node1>
<node2>space$between$the$text</node2>
<node3>$has$to$be$replaced$with$$</node3>
</root>
Я попытался написать код XSLT, который не показывает требуемый вывод ..
Это код:
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[.!='']">
<xsl:call-template name="rep_space">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="rep_space">
<xsl:param name="text"/>
<xsl:variable name="temp" select="'6'"/>
<xsl:choose>
<xsl:when test="contains(text,'2')">
<xsl:call-template name="rep_space">
<xsl:with-param name="text" select="concat((concat(substring-before(text,' '),temp)),substring-after(text,' '))"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
translate (., 'функция ',' $ ') работает .. но не в достаточной степени .. мои вопросы ... что если это строка вместо символа?Я имею в виду, предположим, что я собираюсь заменить '' на "% 20"?И еще один случай: что, если входной XML не «Pretty Print XML», тогда все пространство, появляющееся в XML, заменяется на «$» ..
Pretty print XML - это файл с правильным отступом (обычно мои входные XML никогда не имеют этого), например:
еще один узел, это @ более низкий уровень
Вы можете наблюдать, есть нет "пробелов" перед <new> <test>
узлами, но они на самом деле имеют правильные отступы (с помощью altova XMLSPY мы можем дать простую команду в меню редактирования ... чтобы сделать любые файлы XML "красивыми печатными XML") ..
Где, как в примере ниже ..
<new>
<test>one more node</test>
<test2>
<child>this is @ lower level</child>
</test2>
</new>
Перед всеми начальными тегами стоят пробелы. Тег <child>
имеет больше пробелов, чем узел <test2>
.
Со вторым примером xml .. все пробелы заменяются на "%20
" .. следовательно, результат будет ..
<new>
%20%20<test>one%20more%20node</test>
%20%20<test2>
%20%20%20%20<child>this%20is%20@%20lower%20level</child>
%20%20</test2>
</new>
, конечно, это не ожидается ..
Решения от Dimitre Novatchev и RoЛенд Боуман может также заменить строку другой строкой, изменив параметры, передаваемые вызываемому шаблону.
Это было отличное обучение @Dimitre, @Roland, я очень благодарен и благодаренВам, ребята ..
С уважением,
Children's Pro.