2016-06-06 2 views
0

저는 지금 XSL을 처음 접했습니다. 내가이 제거 어떻게일치하는 것을 제외하고는 XSLT에서 입력 부분을 생략하십시오.

<?xml version="1.0" encoding="UTF-8"?> 
<Info>This is an A</Info>A 
B 
C 

을 얻을 것이다

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

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

<xsl:template match="A"> 
    <xsl:element name="Info">This is an <xsl:value-of select="."/></xsl:element> 
    <xsl:apply-templates/> 
</xsl:template> 

</xsl:stylesheet> 

을 :

내가

<?xml version="1.0" encoding="UTF-8"?> 
<Doc> 
<A>A</A> 
<B>B</B> 
<C>C</C> 
</Doc> 

의 입력을 가지고 다음과 같은 XSLT를 통해 통과 가정 추가 A와 다른 B와 C는 복잡한 트리가 있다고 가정하고 어떻게 matchin 인 요소 만 변환 할 수 있습니까? g 내 템플릿에서 다른 모든 것을 생략하면됩니까? 사전

+0

문제를 해결하지 못하는 문제에 대해 의견을 말하고 문제를 해결하는 답변에 투표하고 가장 유용한 것으로 생각되는 답변을 수락하십시오. 어떤 종류의 피드백도주지 않는 것은 무례합니다. – Tomalak

+0

좋아요, 한 번 더 묻습니다 : 무엇이 도움이되는 답변을 투표에서 제외하고 그 중 하나를 수락 한 것으로 표시합니까? – Tomalak

답변

0

에서

친절한 안부 감사 표시되는 추가 출력은 XSLT의 내장 표준 규칙의 영향이다.

말 : "입력 트리를 반복하고 모든 노드를 처리합니다. 요소 노드의 경우 텍스트 노드를 처리하고 그 내용을 출력에 복사하십시오."

또한 more in-depth explanation #1more in-depth explanation #2 물론 the spec의를 참조하십시오.

특정 노드를 처리하는 규칙 (예 : 템플릿)이 없을 때마다 이러한 표준 규칙이 적용됩니다.

이 여기에 무슨이다 :

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

이 읽 "루트 노드 및 프로세스 매치 (즉, 템플릿 적용) 자식 요소를."

루트 노드를 처리하고 루트 노드의 유일한 하위 인 문서 요소 <Doc>을 처리합니다. 그 후에 프로세서는 아이들을 처리합니다. <A>에 대한 사용자 지정 템플릿이 있지만 <B><C>에 대한 사용자 지정 템플릿이 없습니다. 즉, 기본 규칙이 사용되며 텍스트 내용이 출력으로 끝납니다.

위의 템플릿은 아무런 결과없이 변경되지 않고 완전히 삭제 될 수있는 작업이 없음을 의미합니다. 그것은 기본 규칙이 어쨌든하는 일을 단지 반복합니다.

<xsl:template match="B | C" /> 
  • 어떤 요소 노드와 일치없고를 생성하는 사용자 지정 서식을 확인하십시오

    • <B><C> 일치하고 어떤 출력을 생성하지 않는 사용자 지정 서식을 확인하십시오에서

      방법 출력 :

      <xsl:template match="*" /> 
      

      이것은 일치 표현 특이성 때문에 작동합니다.보다 구체적인 일치 식 덜 특정 사람을보다 선호되므로, match="*"<A> 일치에도 불구하고, match="A"이있는 템플릿이 선호됩니다. match="/*" 위에서 언급 한 바와 같이 문서 요소를 (일치하면서 차이가있다, match="/" 루트 노드와 일치

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

      하는 것으로 :

    • 는 처음에 처리 된 노드에서 <B><C>를 포함하지 마십시오). /*보다 구체적 일 수있는 match="/Doc"을 사용할 수 있습니다. 그러나 /*은 "문서 요소를 호출 할 수있는 것이 무엇이든"표현하기위한 일반적인 규칙입니다.

    세 가지 전략 모두 유효합니다. 사용하려는 상황과 선호도에 따라 다릅니다.

  • +0

    이러한 답변에 많은 감사드립니다. 그들은 내 문제를 해결했습니다. 감사합니다 –

    +0

    @ Jörg 그런데 왜 투표하지도 않았고 승인 된 것으로 표시하지 않았습니까? – Tomalak

    1

    이는 XSLT의 built-in template rules의 발생합니다. 템플릿 text() 일치 :

    는 빈 XSL를 추가로 내장 된 규칙을 무시하는 방법은 여러 가지가 있습니다.

    특정 경우에는 루트 요소 (/*)와 일치하는 템플릿의 xsl : apply-templates에 select를 추가하고 A과 일치하는 템플릿에서 xsl : apply-templates를 제거합니다. . 동적으로 이름을 생성하지 않는 한 요소 :

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    
    <xsl:template match="/*"> 
        <xsl:apply-templates select="A"/> 
    </xsl:template> 
    
    <xsl:template match="A"> 
        <xsl:element name="Info">This is an <xsl:value-of select="."/></xsl:element> 
    </xsl:template> 
    
    </xsl:stylesheet> 
    

    또한 새로운 요소를 생성하는 경우, 당신은이 XSL을 사용하지 할 수 있습니다. 글자 그대로 출력하십시오 ...

    관련 문제