2009-06-16 3 views
1

XSLT를 사용하여 노드의 요소 이름의 하위 문자열을 기반으로 노드를 선택할 수 있습니까?XSLT 요소 이름의 하위 문자열을 기반으로 한 노드 선택

<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는 같은 정규 표현식과 일치하는 노드를 처리하기 위해 선택합니다

는 예를 들어, XML을 고려하십시오. * ".

XSLT 템플릿 일치 속성 표현식이나 apply-templates select 속성 표현식이 필요합니다.이 속성 표현식은 요소의 이름에 정규식을 적용합니다. 그러나 성명서와 같은 구조가 없으면 이것이 가능하지 않을 수 있습니까?

도움을 주시면 감사하겠습니다.

답변

2

시작하기 위해 "foo"로 시작하는 요소를 찾는 XSL이 있습니다. Regular Expression Matching in XSLT 2을 기반으로하는 XSLT 2.0까지 regex 기능이 추가 된 것으로 생각하지 않습니다.

<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의 입력을 보면 "시작 ($ name, 'foo_')"을 권하고 싶습니다. +1 - 의 도움으로 다음 sibling :: text() 노드를 복사하지 않으면 여분의 개행을 방지 할 수 있습니다. – Tomalak

+0

줄 바꿈을 사용할 수 있습니다. 감사. – chernevik

관련 문제