基于元素名称子串的XSLT节点选择

时间:2009-06-16 22:23:08

标签: xslt

如何使用XSLT根据节点元素名称的子字符串选择节点?

例如,考虑XML:

<foo_bar>Keep this.
  <foo_who>Keep this, too.
    <fu_bar>Don't want this.</fu_bar>
  </foo_who>
</foo_bar>

我想从中输出:

<foo_bar>Keep this.
  <foo_who>Keep this, too.
  </foo_who>
</foo_bar>

在这里,我想选择处理名称与“foo。*”等正则表达式匹配的节点。

我认为我需要一个XSLT模板匹配属性表达式,或者一个apply-templates select属性表达式,它将正则表达式应用于元素的名称。但是如果没有像声明这样的构造,这可能无法实现吗?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

以下是一些XSL,它找到以“foo”开头的元素,以帮助您入门。我不认为在基于Regular Expression Matching in XSLT 2的XSLT 2.0之前添加了正则表达式功能。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="*">
        <xsl:variable name="name" select="local-name()"/>
        <xsl:if test="starts-with($name, 'foo')">
            <xsl:copy>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

它给出了这个输出,它似乎有一个额外的换行符。

<foo_bar>Keep this.
  <foo_who>Keep this, too.

  </foo_who>
</foo_bar>