对于一个项目,我坚持使用XSLT-1.0 / XPATH-1.0,并且需要一种快速的方法来从属性值中去除小写前缀。
示例属性值为:
"cmdValue1", "gfValue2", "dTestCase3"
我需要的价值是:
"Value1", "Value2", "TestCase3"
我想出了这个XPath表达式,但它对我的应用来说太慢了:
substring(@attr, 1 + string-length(substring-before(translate(@attr, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '..........................'), '.')))
本质上,上面确实将所有大写字符替换为点,然后从第一个找到的点位置(第一个大写字母)开始,从原始属性值创建一个子字符串。
有没有人知道在XSLT-1.0 / XPATH-1.0中执行此操作的更短/更快的方式?
答案 0 :(得分:3)
我们可以使用XSLT 1.0中的函数不多,所以我尝试使用以下递归模板来避免使用translate函数。
因为它慢了1.5倍,所以它没有回答你的问题。我可以避免有人尝试同样的事情:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xml:space="default" exclude-result-prefixes="" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes" />
<xsl:template match="/">
<out>
<xsl:call-template name="removePrefix">
<xsl:with-param name="prefixedName" select="xml/@attrib" />
</xsl:call-template>
</out>
</xsl:template>
<xsl:template name="removePrefix">
<xsl:param name="prefixedName" />
<xsl:choose>
<xsl:when test="substring-before('_abcdefghijklmnopqrstuvwxyz', substring($prefixedName, 1,1))">
<xsl:call-template name="removePrefix">
<xsl:with-param name="prefixedName" select="substring($prefixedName,2)" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$prefixedName" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
您不需要计算前缀的长度并手动提取子字符串。相反,只需直接询问其后的所有内容:
substring-after(@attr,
substring-before(translate(@attr,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'..........................'),
'.'))
这不是一个巨大的改进,但可能会削减7-8%(基于一些非常粗略和快速的测试)。