Diese Lösung ist etwas komplex. Es verwendet eine Vorlage, um die Zeichenfolge zwischen den Tags zu extrahieren, und eine andere, um diese Zeichenfolge durch das Trennzeichen zu trennen. Welche Zeichenfolge wird durch eine andere Zeichenfolge ersetzt, die in eine andere Datei ausgelagert wird, die die Zuordnung enthält (replacement.xml
). Da XSLT-1.0 RTFs (Resultierende Baumfragmente) in Variablen zurückgibt, ist die Ersetzung in der Vorlage fest codiert. In XSLT-2.0 können Sie eine Variable verwenden, um die Lösung flexibler zu machen.
Hier ist die replacement.xml
enthält die Zuordnungen:
<?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>
Und die XSLT diese Zuordnungen in die Zeichenfolge enthält:
<?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>
Es wäre hilfreich, uns einige Beispiele der sich ändernden Werte zur Verfügung zu stellen. Momentan schießen wir nur ins Dunkle. Beispiel: Es gibt möglicherweise einen Wert namens "Wert1". Mit welchem Wert sollte es ersetzt werden? Und was sind seine Begrenzer? Bisher nehme ich an, dass Sie drei 'strings' zwischen den' ## B2B ## 'Strings haben, die durch ein Zeichen (wahrscheinlich ',') begrenzt sind und durch einen anderen Satz von drei Strings ersetzt werden sollten. Wie sind diese anderen Strings zusammengesetzt? – zx485
Bitte ändern Sie Ihre Fragen nicht wesentlich, nachdem sie beantwortet wurden. –