2009-06-16 4 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> 

Здесь я хочу, чтобы выбрать для обработки этих узлов, имена которых совпадают с регулярным выражением, как «Foo. *».

Мне кажется, мне нужно выражение атрибута соответствия шаблона XSLT или выражение атрибута apply-templates, которое применяет регулярное выражение к имени элемента. Но, может быть, это невозможно сделать без какой-либо конструкции, такой как утверждение?

Любая помощь будет оценена по достоинству.

ответ

2

Вот несколько XSL, которые обнаруживают элементы, начинающиеся с «foo», чтобы вы начали. Я не думаю, что функциональность регулярного выражения была добавлена ​​до XSLT 2.0 на основе Regular Expression Matching in XSLT 2.

<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, я бы порекомендовал «start-with ($ name, 'foo_')», но в остальном это все. +1 - Дополнительную строку новой строки можно предотвратить, не скопировав следующие узлы: text() с помощью . – Tomalak

+0

Я могу работать с новой строкой. Благодарю. – chernevik