2009-06-18 6 views
0

추출 할 노드가 중첩 된 노드가 무시 될 때 XSLT를 사용하여 일부 노드를 추출하고 다른 노드를 추출하는 데 사용합니까?원하지 않는 요소에 중첩 된 경우 XSLT를 선택

고려 :

<alpha_top>This prints. 
    <beta>This doesn't. 
    <alpha_bottom>This too prints.</alpha_bottom> 
    </beta> 
</alpha_top> 

나는 그가 생성하는 변환하려면 :

<alpha_top>This prints. 
    <alpha_bottom>This too prints.</alpha_bottom> 
</alpha_top> 

answer는 요소 태그 이름에 문자열의 존재 여부에 따라 노드를 선택하는 방법을 보여줍니다.

답변

0

좋아, 여기이 기본적으로 항등 변환 않는 좋은 방법

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="beta"> 
    <xsl:apply-templates select="*"></xsl:apply-templates> 
</xsl:template> 

<xsl:template match="/|*|text()"> 
    <xsl:copy> 
     <xsl:apply-templates select="*|text()"></xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

,하지만 당신은 포함하지 않는 요소에 대해 나는 XSL을 제거 : 복사 만에 템플릿을 적용 자식 요소.

+0

고마워요, 저는 이것을 아침에 보겠습니다. XSLT 리소스에 대한 내 질문을 보시겠습니까? 지금 나는 무겁게 마실거야. – chernevik

0

다음과 같은 스타일 시트가 특정 케이스에서 작동하지만 좀 더 일반적인 것을 찾고 있습니다. 나는 또한 더 간단한 방법이 있다고 확신한다.

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <xsl:apply-templates select="alpha_top"></xsl:apply-templates> 
</xsl:template> 

<xsl:template match="alpha_top"> 
    <xsl:copy> 
    <xsl:apply-templates select="beta/alpha_bottom|text()"></xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*|text()"> 
    <xsl:copy> 
     <xsl:apply-templates select="*|text()"></xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
+0

alpha_top 적용 템플릿의 선택 문을 작성할 수 있습니다 : 하나를 찾기 위해 alpha_bottom descendants. 부모 요소가 호출되는 것과 관계 없습니다. –

0

일단 XSLT 탐색이 어떻게 작동하는지 잘 이해하면 (나는 다른 질문에서 대답 했음) 이것이 매우 간단해질 것이라고 생각합니다.

몇 가지 방법이 있습니다. Darrell Miller의 답변에 따르면 전체 문서를 처리하고 관심이없는 요소를 제거해야합니다. 이는 하나의 접근 방법입니다.

앞서 자세히 설명하기 전에 XSLT에서 컨텍스트 개념을 완전히 '알지 못한다'는 인상을 받았습니다. 이것은 중요하며 인생을 더 단순하게 만듭니다. XSLT에서 언제든지 유일한 컨텍스트 노드가 있습니다. 이것은 현재 '처리 중'인 노드 (요소, 속성, 주석 등)입니다. via xsl : template을 선택하면 컨텍스트 노드가 선택됩니다.

<alpha_top>This prints. 
    <beta>This doesn't. 
    <alpha_bottom>This too prints.</alpha_bottom> 
    </beta> 
</alpha_top> 

다음과 같은 :

<xsl:apply-templates select='beta'/> 

<xsl:template match='beta'>...</xsl:template> 

베타 노드는 템플릿 내부의 상황에 맞는 노드가 될 따라서, 귀하의 XML을 제공. 그보다는 조금 더 많은 것이 있지만 많지는 않습니다.

그래서, 당신은 같은 것을 사용하여 스타일 시트를 시작할 때 :

<xsl:template match='/'> 
    <xsl:apply-templates select='alpha_top'/> 
</xsl:apply-templates> 

이 문서 노드의 아이를 선택하는 (유일한 자식 요소는 alpha_top 요소입니다). 내부의 xpath 문은 컨텍스트 노드에 상대적입니다.

이제 최상위 템플릿에서 alpha_bottom 노드 만 처리하기로 결정할 수 있습니다. 그러면 다음과 같은 문구를 넣을 수 있습니다 :

<xsl:template match='/> 
    <xsl:apply-templates select='//alpha_top'/> 
</xsl:template> 

이것은 나무를 걸어 다니며 모든 alpha_top 요소를 선택합니다.

또는 당신은 모든 요소를 ​​처리 할 수 ​​있으며, 단순히 베타 노드의 내용을 무시 : 나는 당신 XSL 내 다른 답변에서 언급 한 바와 같이 (

<xsl:template match='beta'> 
    <xsl:apply-templates/> 
</xsl:template> 

을 : 적용 템플릿에는 선택 속성이 동일하지와 함께 select = ''*)을 사용합니다.

베타 노드의 내용을 무시하지만 모두가 (당신이 템플릿이 가정) 아동 처리합니다.

그래서, 당신의 출력 요소를 무시하는 것은 기본적으로 당신의 선택 속성에 올바른 XPath는 문을 사용하는 문제이다. 물론, 당신이 좋은 XPath는 자습서를 :) 할 수 있습니다

0

(가) 아마 당신의 문제에 대한 간단한 해결책이있다 :

이 당신이 당신의 예에서이 같은 공백 행위가 발생하지 않습니다
<xsl:template match="alpha_top|alpha_bottom"> 
    <xsl:copy> 
    <xsl:value-of select="text()" /> 
    <xsl:apply-templates /> 
    </xsl:copy> 
</xs:template> 

<xsl:template match="text()" /> 

하지만, 이것은 아마 부적절한 것이다.

+0

요청에 대해 더 자세히 설명 드리겠습니다. 지금 당장은 시간이 없습니다. 그냥 물어봐! – Tomalak

관련 문제