在xslt中合并两个字符串

时间:2014-10-02 01:03:10

标签: xml xslt xpath xslt-3.0

我一直试图找出解决这个问题的正确方法,但还没有取得任何成功。问题是我有两个变量 - 一个包含服务器+站点根路径,第二个包含文件的路径,如 -

<xsl:variable name="a">/user/folder/academics/aps/includes</xsl:variable>
<xsl:variable name="b">/aps/includes/something/test.html</xsl:variable> 

我在这里尝试做的是对这两个字符串应用一个函数,以便最终结果看起来像 -

/user/folder/academics/aps/includes/something/test.html

我到目前为止尝试的是tokenize()字符串,然后比较每个项目,但问题是,如果让我们说文件夹名称&#34;学术界&#34;重复两次,它在第一次停止。我确信有更好的方法来解决这个问题。任何建议都非常感谢。

1 个答案:

答案 0 :(得分:4)

如果你愿意假设两条路径之间的最长重叠是一个共同的部分,那么像这样的东西可能适合你:

<xsl:template name="merge-paths">
    <xsl:param name="path1"/>
    <xsl:param name="path2"/>
    <xsl:variable name="root2" select="concat('/', substring-before(substring-after($path2, '/'), '/'), '/')"/>
    <xsl:choose>
        <xsl:when test="contains($path1, $root2)">
            <xsl:variable name="tail1" select="concat($root2, substring-after($path1, $root2))" />
            <xsl:choose>
                <xsl:when test="starts-with($path2, $tail1)">
                    <xsl:value-of select="$path1"/>
                    <xsl:value-of select="substring-after($path2, $tail1)"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="substring-before($path1, $root2)"/>
                    <xsl:value-of select="substring($root2, 1, string-length($root2) - 1)"/>
                    <xsl:call-template name="merge-paths">
                        <xsl:with-param name="path1" select="concat('/', substring-after($path1, $root2))"/>
                        <xsl:with-param name="path2" select="$path2"/>
                    </xsl:call-template>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="substring($path1, 1, string-length($path1) - 1)"/>
            <xsl:value-of select="$path2"/>
        </xsl:otherwise>
    </xsl:choose>   
</xsl:template>

以下是调用模板和结果输出的一些示例:

<强> 1。没有重叠:

    <xsl:call-template name="merge-paths">
        <xsl:with-param name="path1">/a/b/c/</xsl:with-param>
        <xsl:with-param name="path2">/d/e/f.html</xsl:with-param>
    </xsl:call-template>

<result>/a/b/c/d/e/f.html</result>

<强> 2。简单重叠:

    <xsl:call-template name="merge-paths">
        <xsl:with-param name="path1">/a/b/c/d/</xsl:with-param>
        <xsl:with-param name="path2">/c/d/e/f.html</xsl:with-param>
    </xsl:call-template>

<result>/a/b/c/d/e/f.html</result>

第3。双重重叠:

    <xsl:call-template name="merge-paths">
        <xsl:with-param name="path1">/a/b/c/d/c/d/</xsl:with-param>
        <xsl:with-param name="path2">/c/d/e/f.html</xsl:with-param>
    </xsl:call-template>

<result>/a/b/c/d/c/d/e/f.html</result>

<强> 4。错误重叠:

    <xsl:call-template name="merge-paths">
        <xsl:with-param name="path1">/a/b/c/d/x/</xsl:with-param>
        <xsl:with-param name="path2">/c/d/e/f.html</xsl:with-param>
    </xsl:call-template>

<result>/a/b/c/d/x/c/d/e/f.html</result>

请注意path1末尾是否存在结束斜杠 这实际上是一个XSLT 1.0解决方案;可能有更好的方法在以后的版本中实现它(正则表达式?)。