从属性值中剥离前缀

时间:2014-02-11 13:14:34

标签: xslt xpath xslt-1.0

对于一个项目,我坚持使用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中执行此操作的更短/更快的方式?

2 个答案:

答案 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%(基于一些非常粗略和快速的测试)。