XSL:如何按需生成正则表达式模式?

时间:2012-10-28 10:47:43

标签: regex xslt

我想按需生成一个正则表达式模式,不知怎的,我失败了。也许有人知道为什么并且可以提供帮助。

我想要实现的是将元素定义为(例如)在输出中标记为粗体的文本

来源xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
    <cd>
        <strong>Empire</strong>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
    </cd>
    <cd>
        <strong>your</strong>
        <strong>heart</strong>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
    </cd>
</catalog>

XSL:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="no"/>
    <xsl:template match="/">
        <html>
            <body>
                <table border="1">
                    <xsl:for-each select="catalog/cd">
                        <tr>
                            <td>
                                <xsl:call-template name="addBold">
                                    <xsl:with-param name="text" select="title" />
<xsl:with-param name="replace"><xsl:variable name="temp"><xsl:for-each select="strong">|<xsl:value-of select="." /></xsl:for-each></xsl:variable>(<xsl:value-of select='substring-after($temp,"|")' />)</xsl:with-param>
                                </xsl:call-template>
                            </td>
                            <td>
                                <xsl:value-of select="artist" />
                            </td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template name="addBold">
    <xsl:param name="text" />
    <xsl:param name="replace" />
    <xsl:analyze-string select="$text" regex="$replace">

        <xsl:matching-substring>
            <b><xsl:value-of select="regex-group(1)" /></b>
        </xsl:matching-substring>

        <xsl:non-matching-substring>
            <xsl:value-of select="." />
        </xsl:non-matching-substring>

    </xsl:analyze-string>

    </xsl:template>
</xsl:stylesheet>

$replace参数将包含例如。 (your|heart)。但它在xsl:analyze-string元素中从未匹配。

如果我用硬编码的“$replace”替换(your|heart),它总能正常工作..

我错过了一件重要的事吗?就像我不能使用变量/参数作为模式?或者我需要确保它的格式正确吗?我在调用模板段落中做过。

2 个答案:

答案 0 :(得分:2)

您需要为<xsl:analyze-string select="$text" regex="{$replace}">属性使用属性值模板,即regex

答案 1 :(得分:2)

您的问题是您在regex的{​​{1}}属性中使用了变量引用。 regex属性接受一个字符串作为输入。

目前正在评估xsl:analyze-string的值作为字符串文字“$ replace”(不匹配任何内容)。

您需要使用attribute value template来评估变量并使用regex的字符串值:

regex

此外,您可以使用以下内容简化为替换参数创建REGEX的表达式:

<xsl:analyze-string select="$text" regex="{$replace}">