2009-06-16 90 views
1

如何使用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> 

在这里我要选择要处理的名字相匹配,如“富正则表达式的节点。 *”。

我想我需要一个XSLT模板匹配属性表达式或apply-templates选择属性表达式,它将正则表达式应用到元素的名称。但是,如果没有像声明那样的结构,这可能无法完成。

任何帮助,将不胜感激。

回答

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> 
+0

看看OP的输入我会推荐“starts-with($ name,'foo_')”,但除此之外就是这样。 +1 - 通过在的帮助下不复制following-sibling :: text()节点,可以防止额外换行。 – Tomalak 2009-06-17 08:56:10

相关问题