我在我正在使用的XSL
文件中遇到了以下代码段。 XSL
基本上将HTML
标记和国际内容(主要是重音字符)转换为QuarkXPress可摘取的格式。
我根本不熟悉XSL并且从代码判断看起来我们正在检查正则表达式的一些内容,如果它匹配则转换它,如果不是,我们将传递它以查看是否下一个模板可以匹配它。
对于未经训练的人来说,这种方法似乎没问题但是XSL文件充满了重复。
必须有一种更清晰的方式来写这个。你能救我一下吗?
编辑:解释重复。
在下面的块中,我有两个几乎完全相同的块,文件中还有大约50个块。块之间唯一的变化是:模板名称,正则表达式,matching-substring标签的内容以及在non-matching-substring块中调用的内容。
<!-- convert HTML <br> tag to ASCII/Quark new line tag -->
<xsl:template name="break-tag">
<xsl:param name="string" select="string(.)"/>
<xsl:analyze-string select="$string" regex="<br>" flags="i">
<xsl:matching-substring>
<xsl:text disable-output-escaping="yes"><\n></xsl:text>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:call-template name="open-list-tag"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
<!-- convert HTML <li> tag to Bull Text stylesheet with bullet tag and tab tag -->
<xsl:template name="open-list-tag">
<xsl:param name="string" select="string(.)"/>
<xsl:analyze-string select="$string" regex="<li>" flags="i">
<xsl:matching-substring>
<xsl:text disable-output-escaping="yes">@F07/2 Bullet Points:</xsl:text>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:call-template name="euro-char-entity"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
答案 0 :(得分:4)
XSL是XML的脚本语言, 以XML格式编写 。因为它是XML,所有指令都是XML标记,同样所有打开的XML标记都需要关闭XML标记。
对于XSL,这个片段实际上非常简洁。
您对代码执行操作的总结是正确的。 XSL很容易学习,但我会为你澄清几个标签
<xsl:template name="break-tag">
...
</xsl:template>
xsl:template大致相当于一个函数
<xsl:param name="string" select="string(.)"/>
这是模板/功能的输入参数。字符串(。)是调用此模板时当前在范围内的文本
<xsl:analyze-string select="$string" regex="<br>" flags="i">
<xsl:matching-substring>
<xsl:text disable-output-escaping="yes"><\n></xsl:text>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:call-template name="open-list-tag"/>
</xsl:non-matching-substring>
</xsl:analyze-string>
将字符串与正则表达式进行比较。如果匹配,则“&lt; \ n&gt;”被写入输出。如果没有匹配,则调用另一个模板(open-list-tag)。
编辑 - 复制
XSL具有开关/案例指令以及扩展的正则表达式功能。您可以修改它以满足您的需要:
<xsl:choose>
<xsl:when test="matches(string(.),'<br>')">
<xsl:text disable-output-escaping="yes"><\n></xsl:text>
</xsl:when>
<xsl:when test="matches(string(.),'<li>')">
<xsl:text disable-output-escaping="yes">@F07/2 Bullet Points:</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>Unkown Tag: <xsl:value-of select="string(.)"/></xsl:text>
</xsl:otherwise>
</xsl:choose>