代码之家  ›  专栏  ›  技术社区  ›  Chris Huang-Leaver Tom-Oliver Heidel

如何使用XSLT进行通配符匹配?

  •  9
  • Chris Huang-Leaver Tom-Oliver Heidel  · 技术社区  · 14 年前

    如果我有这样的源文件:

    <animal name="fred_monkey" />
    <animal name="jim_banana" />
    <animal name="joe_monkey" />
    

    我可以在我的样式表中创建一个XPATH表达式,它只选择名称中带有字符串“_monkey”的动物吗?

    e、 g.通配符匹配“*_monkey”?

    1 回复  |  直到 14 年前
        1
  •  29
  •   Dimitre Novatchev    14 年前

    我能在我的 只选择 他们的名字?

    e、 g.通配符匹配“*_monkey”?

    这个通配符表示 以…结尾的字符串 “猴子”,不是 包含 “猴子”。

    使用

    //animal[ends-with(@name, '_monkey')]
    

    上面使用标准的XPath 2.0函数 ends-with()

    在XSLT 1.0中,使用以下xpath1.0表达式 :

    //animal[substring(@name, string-length(@name) -6)='_monkey']
    

    不建议使用 // . 只要知道XML文档的结构,就使用更具体的位置链测试。例如,如果 animal 元素都是XML文档顶部元素的子元素,那么下面的XPath(分别为2.0或1.0)表达式可能更有效:

    /*/animal[ends-with(@name, '_monkey')]
    

    /*/animal[substring(@name, string-length(@name) -6)='_monkey']
    

    根据一个人的具体需要(例如,你真正的意思是“包含”而不是“以”结尾),函数 contains() , starts-with() substring() 也可能有用:

    contains(someString, someTargetString)
    
    starts-with(someString, someTargetString)
    
    substring(someString, start-index, length) = someTargetString
    

    最后 match <xsl:templates> 不需要包含绝对XPath表达式 --建议只使用指定足够上下文的相对XPath表达式。

    因此,上面用作匹配表达式的内容如下:

    <xsl:template match="animal[ends-with(@name, '_monkey')]">
    

    <xsl:template match=
      "animal[substring(@name, string-length(@name) -6)='_monkey']">