Если вы готовы предположить, что самое длинное перекрытие между двумя путями является общей частью, тогда что-то вроде этого может сработать для вас:
<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>
Обратите внимание на наличие закрывающей косой черты в конце пути 1.
Фактически это решение XSLT 1.0; могут быть лучшие способы реализовать это в более поздних версиях (регулярное выражение?).
person
michael.hor257k
schedule
02.10.2014
/user/folder/academics/aps/includes/includes/something/test.html?
- person michael.hor257k   schedule 02.10.2014