XSL匹配多个值上的节点

时间:2013-02-08 15:51:56

标签: xml xslt

我有一个看起来像

的xml文档
<a>
<somenode att="1"></somenode>
</a>
<a01>
<apple att="2"></apple>
<somenode att="1"></somenode>
</a01>

我想尝试做的是匹配节点名称是'a'还是后跟一个数字(a0)和后跟两个数字(a01),有关如何做到这一点的任何想法?

到目前为止,我有以下内容

<xsl:apply-templates select="node()[starts-with(name(),'a')]">

但是这会选择苹果,以及如何做和OR / AND这样的多个匹配?

1 个答案:

答案 0 :(得分:4)

在XSLT 2.0中,这将非常简单:

<xsl:apply-templates select="node()[matches(name(),'^a\d?\d?$')]">

在XSLT 1.0中,正则表达式不可用,所以它有点棘手,但以下应该有效:

<xsl:apply-templates select="node()[starts-with(name(), 'a') and
                                    string-length(name()) &lt;= 3 and
                                    translate(name(), '0123456789', '') = 'a']" />

这里用“和”连接的三个部分确保:

  • 名称以“a”
  • 开头
  • 名称不超过3个字符
  • 当从名称中删除数字时剩下的全部是字符串“a”(意味着除了单个“a”之外的任何字符都是数字)。