如何在XSLT中对字符串变量执行替换操作?附提取URL脚本
在XSLT中执行字符串替换的方法
嘿,刚好你用的是XSLT 2.0,处理字符串替换其实超级方便——直接用内置的replace()函数就可以搞定!
核心语法
replace()是XSLT 2.0及以上版本的内置函数,语法很直观:
replace(input-string, search-pattern, replacement-string[, flags])
各参数说明:
input-string:要替换的目标字符串(可以是变量、节点文本值等)search-pattern:默认是正则表达式;如果只想做字面匹配,加'q'标志就行(后面有例子)replacement-string:用来替换匹配内容的新字符串flags:可选参数,比如'q'表示字面匹配(不用转义特殊字符)、'i'表示忽略大小写
结合你的URL提取场景示例
假设你已经从XML里提取到URL并存到了变量$original-url中,下面给几个常见的替换场景:
场景1:把HTTP协议换成HTTPS
<!-- 先提取原始URL --> <xsl:variable name="original-url" select="ns0:your-url-node/text()"/> <!-- 执行替换:匹配开头的http://并替换成https:// --> <xsl:variable name="modified-url" select="replace($original-url, '^http://', 'https://')"/>
场景2:字面替换域名(不用正则转义)
如果你的替换内容里有.这类正则特殊字符,不想写转义符,就用'q'标志做字面匹配:
<xsl:variable name="modified-url" select="replace($original-url, 'old-domain.com', 'new-domain.com', 'q')"/>
场景3:批量替换路径中的特定片段
比如把URL里所有的/archive/换成/new-archive/:
<xsl:variable name="modified-url" select="replace($original-url, '/archive/', '/new-archive/')"/>
嵌入到你现有脚本的完整示例
把替换逻辑加到你的XSLT里,大概是这样:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ns="http://www.openarchives.org/OAI/2.0/" xmlns:ns0="http://schema.fabrik.de/data/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="dc dcterms"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <!-- 从XML中提取目标URL --> <xsl:variable name="original-url" select="ns:OAI-PMH/ns:GetRecord/ns:record/ns0:your-url-element/text()"/> <!-- 执行替换操作 --> <xsl:variable name="updated-url" select="replace($original-url, 'http://', 'https://')"/> <!-- 输出处理后的结果 --> <processed-urls> <original><xsl:value-of select="$original-url"/></original> <updated><xsl:value-of select="$updated-url"/></updated> </processed-urls> </xsl:template> </xsl:stylesheet>
小提醒:如果是XSLT 1.0版本,没有内置的
replace()函数,得用递归模板或者扩展函数,但你用的是2.0,完全不用操心这个~
内容的提问来源于stack exchange,提问作者Oleg_08
相关产品推荐
相关产品推荐

