如何缩短此XSL块?

时间:2009-12-09 17:48:30

标签: xslt

我在我正在使用的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="&lt;br&gt;" flags="i">
            <xsl:matching-substring>
                <xsl:text disable-output-escaping="yes">&lt;\n&gt;</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="&lt;li&gt;" 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>

1 个答案:

答案 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="&lt;br&gt;" flags="i">
    <xsl:matching-substring>
        <xsl:text disable-output-escaping="yes">&lt;\n&gt;</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(.),'&lt;br&gt;')">
     <xsl:text disable-output-escaping="yes">&lt;\n&gt;</xsl:text>
   </xsl:when>
   <xsl:when test="matches(string(.),'&lt;li&gt;')">
     <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>
相关问题