Это решение несколько сложное. Он использует один шаблон для извлечения строки между тегами и другой для разделения этой строки разделителем. Какую строку заменяет другая строка, переданная в другой файл, содержащий сопоставление (replacement.xml
). Поскольку XSLT-1.0 возвращает RTF (результирующие фрагменты дерева) в переменных, замена жестко закодирована в шаблоне. В XSLT-2.0 вы можете использовать переменную, которая делает решение более гибким.
Вот это replacement.xml
, содержащие отображения:
<?xml version="1.0" encoding="UTF-8"?>
<replacement>
<r src="abc">value1</r>
<r src="controls">value2</r>
<r src="free text">value3</r>
</replacement>
а также XSLT включения этих отображений в строку:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/lines/Remarks">
<xsl:variable name="tagName" select="'## B2B##'" />
<xsl:variable name="subStrToReplace">
<xsl:call-template name="strInTag">
<xsl:with-param name="str" select="text()" />
<xsl:with-param name="tagName" select="$tagName" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="replacementString">
<xsl:call-template name="splitAndReplace">
<xsl:with-param name="pText" select="$subStrToReplace" />
</xsl:call-template>
</xsl:variable>
<Remarks>
<xsl:value-of select="concat(normalize-space(substring-before(text(),$tagName)), ',',$replacementString, normalize-space(substring-after(substring-after(text(),$tagName),$tagName)))" />
</Remarks>
</xsl:template>
<xsl:template name="strInTag">
<xsl:param name="str" />
<xsl:param name="tagName" />
<xsl:value-of select="normalize-space(substring-before(substring-after($str,$tagName),$tagName))" />
</xsl:template>
<xsl:template name="splitAndReplace">
<xsl:param name="pText"/>
<xsl:if test="string-length($pText) > 0">
<xsl:variable name="vNextItem" select="substring-before(concat($pText, ','), ',')"/>
<xsl:value-of select="concat($vNextItem,':',document('replacement.xml')/replacement/r[@src = $vNextItem]/text(),',')"/>
<xsl:call-template name="splitAndReplace">
<xsl:with-param name="pText" select="substring-after($pText, ',')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Было бы полезно предоставить нам некоторые образцы изменяющихся значений. Пока что это просто стреляет в темноту. Например: может быть значение с именем 'value1'. Какую ценность следует заменить? И каковы его разделители? До сих пор я предполагаю, что у вас есть три строки '' между строками '## B2B ##', которые ограничены символом (возможно, ',') и должны быть заменены другим набором из трех строк. Как складываются эти другие струны? – zx485
Пожалуйста, не изменяйте свои вопросы значительно после ответа. –