我想按需生成一个正则表达式模式,不知怎的,我失败了。也许有人知道为什么并且可以提供帮助。
我想要实现的是将元素定义为(例如)在输出中标记为粗体的文本
来源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)
,它总能正常工作..
我错过了一件重要的事吗?就像我不能使用变量/参数作为模式?或者我需要确保它的格式正确吗?我在调用模板段落中做过。
答案 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}">