有 XML。
<file>
<section>
<comment># Секция заслешивания путей без слеша в конце</comment>
<rule typename="RewriteRule" pattern="/([-a-zA-Z]+)" substitution="/$1/" flags="R=301,L" />
<rule typename="RewriteRule" pattern="/([-a-zA-Z]+)/([-a-zA-Z]+)" substitution="/$1/$2/" flags="R=301,L" />
<rule typename="RewriteRule" pattern="/([-a-zA-Z]+)/([-a-zA-Z]+)/([-a-zA-Z]+)" substitution="/$1/$2/$3/" flags="R=301,L" />
</section>
<section>
<comment># Секция преобразования URL в вызов контроллера</comment>
</section>
</file>
在转换后的输出中,我们得到以下文本文档。
# Секция заслешивания путей без слеша в конце
RewriteRule ^/([-a-zA-Z]+)/([-a-zA-Z]+)/([-a-zA-Z]+)$ /$1/$2/$3/ [R=301,L]
RewriteRule ^/([-a-zA-Z]+)/([-a-zA-Z]+)$ /$1/$2/ [R=301,L]
RewriteRule ^/([-a-zA-Z]+)$ /$1/ [R=301,L]
# Секция преобразования URL в вызов контроллера
我们有以下用于处理节点的模板rule
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- шаблон сопоставления с узлом rule -->
<xsl:template match="rule">
<!-- Если у узла rule есть хотябы узел типа и он не пустой -->
<xsl:if test="@typename != ''">
<!-- Выведем переход строки -->
<xsl:text>
</xsl:text>
<!-- Выведем из текущего узла тип правила -->
<xsl:value-of select="@typename"></xsl:value-of>
<!-- Начинаем паттерн с сопоставления с началом строки -->
<xsl:text> ^</xsl:text>
<!-- Выведем сам паттерн -->
<xsl:value-of select="@pattern"></xsl:value-of>
<!-- Завершим сопостовлением с концом строки -->
<xsl:text>$ </xsl:text>
<!-- Выведем правило подстановки -->
<xsl:value-of select="@substitution"></xsl:value-of>
<!-- Если есть свойство флагов и оно не пустое -->
<xsl:if test="@flags != ''">
<!-- Начнем выводить блок флагов -->
<xsl:text> [</xsl:text>
<!-- Выведем влаги -->
<xsl:value-of select="@flags"></xsl:value-of>
<!-- Завершаем вывод флагов -->
<xsl:text>]</xsl:text>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
问题是如何修改模板,以便在每个模式中它会从类型字符串中删除第一个斜杠,^/([-a-zA-Z]+)$
并且模式看起来像这样^([-a-zA-Z]+)$
使用文本函数
substring()
或substring-after()
.substring()
返回源字符串中指定位置开始的子串,substring-after()
返回指定字符后的子串