我如何从xslt中的字符串解析Pipeline标志

时间:2013-07-08 11:53:21

标签: xslt

如何从xslt中的字段解析管道标志。 e.g。

dummy1 | dummy2 | dummy3 | dummy4

此致 萨拉

2 个答案:

答案 0 :(得分:3)

如果您使用的是XSLT 2.0处理器,则可以使用tokenize功能(http://www.w3.org/TR/xpath-functions/#func-tokenize),例如输入

<foo>dummy1|dummy2|dummy3|dummy4</foo>

你可以匹配

<xsl:template match="foo">
  <xsl:value-of select="tokenize(., '\|')"/>
</xsl:template>

输出dummy1 dummy2 dummy3 dummy4。如果您使用XSLT 1.0处理器,您可以检查它是否支持http://www.exslt.org/str/functions/tokenize/等扩展函数,或者您需要编写一个递归的命名模板来分割输入。

答案 1 :(得分:1)

在xlst 1.0中,我通常使用命名模板的递归调用,例如

<?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" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:variable name="dummyVar" select="'dummy1|dummy2|dummy3|dummy4'" />
    <xsl:variable name="delimiter" select="'|'" />

    <xsl:template match="/">
        <dummies>
            <xsl:call-template name="parseDummy">
                <xsl:with-param name="parsedString" select="$dummyVar" />
            </xsl:call-template>
        </dummies>
    </xsl:template>

    <xsl:template name="parseDummy">
        <xsl:param name="parsedString" />
        <xsl:choose>
            <xsl:when test="contains($parsedString, $delimiter)">
                <xsl:element name="{substring-before($parsedString, $delimiter)}" />
                <xsl:call-template name="parseDummy">
                    <xsl:with-param name="parsedString" select="substring-after($parsedString, $delimiter)" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:element name="{$parsedString}" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

你需要对解析的值做些什么,例如我构造了一个名字为虚拟的元素。

注意正在改变的背景。