Xml 使用XSL标记化后的连接

Xml 使用XSL标记化后的连接,xml,xslt,Xml,Xslt,我有一个字符串输入,我想从中得到一些特定的值并对它们进行编码。到目前为止,我能够标记它们。但是,怎样才能做到这一点呢? 这是我的输入字符串: 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

我有一个字符串输入,我想从中得到一些特定的值并对它们进行编码。到目前为止,我能够标记它们。但是,怎样才能做到这一点呢? 这是我的输入字符串:

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=43;domain=delta.com;路径=/;保护
id=34e;路径=/
α=21;路径=/

我现在想要的是,将delta、id和alpha的名称-值对合并到一个变量中。因此xsl变量将保存以下值:
delta=43;id=34e;alpha=21

如果您可以使用完整的XSLT2.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>

但如果不是,你可能不得不这样做

<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>

;

如果您可以使用完整的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>

但如果不是,你可能不得不这样做

<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>

;

我建议根据需要使用单独的模板来执行标记化、concat和字符串格式(避免使用完整的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> 

然后结果(如预期的那样):

delta=43;id=34e;α=21

我建议根据需要使用单独的模板来执行标记化、concat和字符串格式(避免使用完整的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> 

然后结果(如预期的那样):

delta=43;id=34e;α=21

您能确认您使用的是什么XSLT处理器吗?样式表上显示的是
version=“2.0”
,但您使用的是exslt扩展函数,如果您使用的是XSLT 2.0处理器,则不需要这些扩展函数。谢谢我在DataPower XSLT处理器中使用这个。它不支持XSLV2.0的所有功能。您能确认您正在使用的XSLT处理器吗?样式表上显示的是
version=“2.0”
,但您使用的是exslt扩展函数,如果您使用的是XSLT 2.0处理器,则不需要这些扩展函数。谢谢我在DataPower XSLT处理器中使用这个。它不支持XSLV2.0的所有功能。