2016-04-14 12 views
0

Eingang:XSL: Ersetzen Wert innerhalb Tag

<Remarks>Random data## B2B## abc,controls,free text ## B2B## random data</Remarks> 

Die XSL

"## B2B ## abc, Kontrollen, Freitext ## B2B ##"

ersetzen soll

im Tag Bemerkungen mit

„Wert1: abc, Wert2: Kontrollen, value 3: freier Text“

gewünschte Ausgabe:

<Remarks>Random data,value1:abc,value2:controls,value3:free text,random data</Remarks> 

Hinweis: Die Werte in ## B2B## Tags sind unbekannt und jedes Mal ändern, denn jetzt habe ich die Beispielwerte.

+0

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

+0

Bitte ändern Sie Ihre Fragen nicht wesentlich, nachdem sie beantwortet wurden. –

Antwort

0

Angenommen, es genau einen „Platzhalter“ begrenzt sein wird, immer von ## B2B##, und dass es immer genau 3 Komma-getrennte "Tokens" enthält, können Sie dies ganz einfach tun:

<xsl:template match="Remarks"> 
    <xsl:copy> 
     <xsl:value-of select="substring-before(., '## B2B##')" /> 

     <xsl:variable name="placeholder" select="substring-before(substring-after(., '## B2B##'), '## B2B##')" /> 
     <xsl:text> value1: </xsl:text> 
     <xsl:value-of select="substring-before($placeholder, ',')" /> 
     <xsl:text> value2: </xsl:text> 
     <xsl:value-of select="substring-before(substring-after($placeholder, ','), ',')" /> 
     <xsl:text> value3: </xsl:text> 
     <xsl:value-of select="substring-after(substring-after($placeholder, ','), ',')" /> 

     <xsl:value-of select="substring-after(substring-after(., '## B2B##'), '## B2B##')" /> 
    </xsl:copy> 
</xsl:template> 
0

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>