在<xsl:match =“mytag *”> </xsl:match =“mytag *”>中使用通配符

时间:2012-06-14 08:54:33

标签: xml xslt

我正在尝试创建一个xsl模板,它将接受通配符作为模板匹配的一部分,如下例所示:

<xsl:template match="*_Nokia_5.0">
  <xsl:value-of select="."/>
  <xsl:text>,</xsl:text>
  <xsl:if test="position()=last()">
    <xsl:text>&#10;</xsl:text>
  </xsl:if>

我想要实现的是'匹配任何带有'Nokia_5.0'的标签作为字符串的一部分。 我有什么办法可以在xslt 1.0中做到这一点吗?

由于

2 个答案:

答案 0 :(得分:2)

使用contains(name(), "Nokia_5.0")不是解决方案,因为它会在名称上返回误报:

myNokia_5.0isAwsome

但要求是名称必须结束并带有字符串'Nokia_5.0'


正确的解决方案

在XSLT 2.0中

<xsl:template match="*[ends-with(name(), 'Nokia_5.0')]">

在XSLT 1.0中

<xsl:template match=
 "*[substring(name(), string-length(name()) -8) = 'Nokia_5.0')]">

答案 1 :(得分:1)

假设您的意思是节点名称必须包含给定的字符串,您可以使用contains()

<xsl:template match='*[contains(name(), "Nokia_5.0")]'>

然而,这意味着任何不符合此要求的节点都缺少模板,如果您将模板应用于所有节点,则会按原样输出。

相反,您可以在模板定义中但不是在应用模板时使过滤器规定。

<xsl:apply-templates select='node[contains(name(), "Nokia_5.0")]' />
....
<xsl:template match='node'>
    <xsl:value-of select='.' />
</xsl:template>