2017-12-19 4 views
0

Ich habe einen String-Eingang, von dem ich einen bestimmten Wert erhalten und concat ihnen wollte. Bei weitem bin ich in der Lage, sie zu symbolisieren. Aber wie kann man sie beschlagnahmen? Hier ist meine Eingabestring:Verkettung nach Tokenize mit XSL

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:dp="http://www.datapower.com/extensions" xmlns:dyn="http://exslt.org/dynamic"  extension-element-prefixes="dp regexp" xmlns:str="http://exslt.org/strings"  exclude-result-prefixes="dp dyn str"> 
    <xsl:output method="xml" encoding="utf-8" indent="no" /> 
    <xsl:template match="/"> 
     <xsl:variable name="adVal" select="'delta=43; domain=.com; path=/; secure, id=34e; path=/, alpha=21; path=/'" /> 
     <xsl:variable name="tokenizedadVal" select="str:tokenize($adVal, ',')" />  
    </xsl:template> 
</xsl:stylesheet> 

Nach der Verwendung der I wie unten die Ausgabe sehen:

delta=43; domain=.com; path=/; secure, id=34e; path=/, alpha=21; path=/ 

Das ist mein XSL ist

<token>delta=43; domain=delta.com; path=/; secure</token> 
<token>id=34e; path=/</token> 
<token>alpha=21; path=/</token> 

Was ich jetzt will, ist um das Name-Wert-Paar für Delta, ID & alpha zu concattieren und es in eine Variable zu setzen. Damit die xsl-Variable den Wert delta=43;id=34e;alpha=21 enthält.

+0

Können Sie bestätigen, was XSLT-Prozessor Sie verwenden? Ihr Stylesheet sagt 'version =" 2.0 "', aber Sie verwenden Exslt-Erweiterungsfunktionen, die unnötig wären, wenn Sie einen XSLT 2.0-Prozessor verwenden würden. Vielen Dank! –

+0

Ich verwende dies in DataPower XSLT Prozessor. Das unterstützt nicht alle Funktionen von XSL v2.0. – Sierra

Antwort

1

Wenn Sie einen vollständigen XSLT 2.0 Prozessor verwenden könnte, könnte man so etwas tun ...

<xsl:value-of select="for $i in $tokenizedadVal return substring-before($i, ';')" separator=";" /> 

Aber wenn nicht, werden Sie wahrscheinlich so etwas zu tun haben ...

<xsl:for-each select="$tokenizedadVal"> 
    <xsl:if test="position() > 1">;</xsl:if> 
    <xsl:value-of select="substring-before(., ';')" />  
</xsl:for-each> 
1

ich schlage vor, eigene Vorlage zu verwenden, um Ihre tokenize, concat und das Format der Zeichenfolge auszuführen, wie erforderlich (Vermeidung von Voll XSLT 2.0 Prozessor verwenden) finden Sie XSL unter:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="utf-8" indent="no" /> 

    <xsl:template name="str-split"> 
     <xsl:param name="param.str" /> <!-- input string--> 
     <xsl:param name="param.sep" /> <!-- block separator--> 
     <xsl:param name="param.fval.before" /> <!--special character before which value will be taken--> 
     <!--build required string--> 
     <xsl:variable name="var.str.final"> 
      <xsl:if test="string-length($param.str) > 0"> 
       <xsl:variable name="var.item" select="substring-before(concat($param.str, $param.sep), $param.sep)"/> 
       <xsl:value-of select="concat(substring-before(normalize-space($var.item), $param.fval.before), ' ')"/>   
       <xsl:call-template name="str-split"> 
        <xsl:with-param name="param.str" select="substring-after($param.str, $param.sep)"/> 
        <xsl:with-param name="param.sep" select="$param.sep"/> 
        <xsl:with-param name="param.fval.before" select="$param.fval.before"/> 
       </xsl:call-template>  
      </xsl:if>  
     </xsl:variable> 
     <!--format required string--> 
     <xsl:value-of select="translate(normalize-space($var.str.final), ' ', $param.fval.before)"/> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:variable name="adVal" select="'delta=43; domain=.com; path=/; secure, id=34e; path=/, alpha=21; path=/'" /> 
     <!--as you require use call-template inside of variable to store your formatted string--> 
     <xsl:variable name="yourFinalString"> 
      <xsl:call-template name="str-split"> 
       <xsl:with-param name="param.str" select="$adVal"/> 
       <xsl:with-param name="param.sep" select="','"/> 
       <xsl:with-param name="param.fval.before" select="';'"/> 
      </xsl:call-template> 
     </xsl:variable> 
     <!--simply run your variable inside token block, or run without block--> 
     <token> 
      <xsl:value-of select="$yourFinalString"/> 
     </token> 

    </xsl:template> 
</xsl:stylesheet> 

führen dann (wie erwartet):

<token>delta=43;id=34e;alpha=21</token>