gpt4 book ai didi

xml - 在xslt中合并两个字符串

转载 作者:行者123 更新时间:2023-12-03 17:03:54 29 4
gpt4 key购买 nike

我一直在尝试找出解决此问题的正确方法,但尚未取得任何成功。问题是我有两个变量-一个包含服务器+站点根路径,另一个包含类似文件的路径-

<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()字符串,然后比较每个项目,但是问题是,如果说文件夹名称“ academics”重复两次,则它停在第一个。我敢肯定有更好的方法来解决此问题。任何建议都将受到高度赞赏。

最佳答案

如果您愿意假定两条路径之间的最长重叠是常见的一部分,那么类似的方法可能对您有用:

<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解决方案。在更高版本中可能有更好的方法来实现此功能(正则表达式?)。

关于xml - 在xslt中合并两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26153009/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com