3

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

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

源代码:

<?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)”替换它总是可以正常工作..

我错过了什么重要的事情吗?就像我不能使用变量/参数作为模式?还是我需要确保它的格式正确?我在调用模板段落中所做的。

4

2 回答 2

2

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

于 2012-10-28T11:13:59.860 回答
2

您的问题是您regexxsl:analyze-string. regex 属性接受字符串作为输入。

它目前正在评估regex字符串文字 "$replace" 的值(它不会匹配任何内容)。

您需要使用属性值模板才能评估变量并将其字符串值用于regex

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

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

<xsl:with-param name="replace" select="concat('(',string-join(strong,'|'),')')">                                     
于 2012-10-28T11:14:08.160 回答