XSLT 2.0正则提取子串:Linux云部署返回空值求助
解决XSLT 2.0
<xsl:analyze-string>在Linux云环境返回空的问题 看起来你遇到的核心问题大概率是云环境使用的XSLT处理器不支持XSLT 2.0,再加上原正则表达式的匹配范围有限,导致部署后无法得到预期结果。咱们一步步来解决:
1. 先排查云环境的XSLT处理器版本
Linux上常用的xsltproc(基于libxslt)只支持XSLT 1.0,而<xsl:analyze-string>是XSLT 2.0才新增的特性——如果你的部署环境用的是xsltproc,那肯定会返回空或者直接报错。
你需要确认云环境是否使用了支持XSLT 2.0的处理器,比如Saxon-HE(开源免费)。如果没有安装,需要先部署Saxon来处理你的XSLT代码。
2. 修正正则表达式,覆盖更多场景
看你的预期输出,第三条日志的GS-S.4554-0504-2089需要完整保留,但原正则GS\.?只匹配GS后面跟可选的点,无法覆盖GS-S这种带横杠的变体。我们需要调整正则,把匹配范围扩展到GS开头的任意前缀,直到目标数字格式部分:
将原正则改为:^(GS.*?\d{4}-\d{4}-\d{4})
^锚定字符串开头GS.*?非贪婪匹配GS开头的任意内容(兼容GS.、GS-S等变体)\d{4}-\d{4}-\d{4}匹配三组4位数字用横杠分隔的核心格式.*$匹配后面所有多余后缀
3. 简化代码:用replace()替代<xsl:analyze-string>
XSLT 2.0的replace()函数可以更简洁地实现你的需求,避免<xsl:analyze-string>可能带来的兼容性问题。替换原来的<xsl:analyze-string>代码块为:
<td> <xsl:value-of select="replace(msg, '^(GS.*?\d{4}-\d{4}-\d{4}).*$', '$1')"/> </td>
这个写法会直接用捕获到的目标内容替换整个字符串,自动去掉多余后缀。
4. 修改后的完整XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match="/"> <html> <body> <h2>SVN Issues</h2> <table border="1"> <tr bgcolor="#9acd32"> <th style="text-align:left">ver</th> <th style="text-align:left">author</th> <th style="text-align:left">date</th> <th style="text-align:left">ticket</th> </tr> <xsl:for-each select="log/logentry"> <tr> <td><xsl:value-of select="@revision"/></td> <td><xsl:value-of select="author"/></td> <td><xsl:value-of select="date"/></td> <td> <xsl:value-of select="replace(msg, '^(GS.*?\d{4}-\d{4}-\d{4}).*$', '$1')"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
5. 验证效果
在支持XSLT 2.0的处理器(比如Saxon)上运行这段代码,会完美输出你预期的结果:
- 处理
GS.4554-0504-2089-4545→ 返回GS.4554-0504-2089 - 处理
GS.4554-0504-2089-2→ 返回GS.4554-0504-2089 - 处理
GS-S.4554-0504-2089→ 返回GS-S.4554-0504-2089
内容的提问来源于stack exchange,提问作者Ajay Srikanth
相关产品推荐
相关产品推荐

