我有一个字符串输入,我想从中获得一些特定的值并将它们连接起来。到目前为止,我能够将它们标记化。但是如何连接它们呢? 这是我的输入字符串:
delta=43; domain=.com; path=/; secure, id=34e; path=/, alpha=21; path=/
这是我的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>
使用后我可以看到如下输出:
<token>delta=43; domain=delta.com; path=/; secure</token>
<token>id=34e; path=/</token>
<token>alpha=21; path=/</token>
我现在想要的是连接delta,id和amp;的名称值对。 alpha并将其放入变量中。这样xsl变量将保存值:delta=43;id=34e;alpha=21
。
答案 0 :(得分:1)
如果你可以使用完整的XSLT 2.0处理器,你可以做这样的事情......
<xsl:value-of select="for $i in $tokenizedadVal return substring-before($i, ';')" separator=";" />
但如果没有,你可能不得不做这样的事情......
<xsl:for-each select="$tokenizedadVal">
<xsl:if test="position() > 1">;</xsl:if>
<xsl:value-of select="substring-before(., ';')" />
</xsl:for-each>
答案 1 :(得分:1)
我建议使用单独的模板根据需要执行你的tokenize,concat和string格式(避免使用完整的XSLT 2.0处理器),请参阅下面的XSL:
<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>
然后结果(如预期的那样):
<token>delta=43;id=34e;alpha=21</token>