2008-10-03 7 views
10

웹 콘텐츠 제작을 위해 XML -> XSLT -> HTML meme을 살펴 보겠습니다. 나는 XSLT 경험이 거의 없다.XSLT 추상화

추상화 또는 "리팩토링"을 처리하기 위해 XSLT에서 어떤 메커니즘을 사용할 수 있는지 궁금합니다.

예를 들어 일반 HTML과 서비스 측 포함을 사용하면 많은 페이지를 템플릿으로 만들 수 있습니다. 예를 들어 일반적인 머리글, 탐색 및 바닥 글 세그먼트가 있고 페이지 자체는 기본적으로 본문입니다.

일반적인 마크 업 언어 인 JSP, PHP, ASP는 모든 세그먼트에 동적 콘텐츠 (예 : 모든 헤더 블록에 사용자 이름 추가)를 허용합니다.

JSP는 콘텐츠를 생성 할 때 사용되는 인수를 허용 할 수있는 태그 파일을 만들 수있게하여 태그 자체 내에서 콘텐츠를 둘러싸고 작업 할 수도 있습니다.

나는 XSLT 내에서 비슷한 기능이 수행되고 있는지 궁금합니다. HTML 페이지 작성과 같은 용도로 XSLT 블록을 재사용 할 수있는 기능은 무엇입니까?

+1

"meme"? 나는 이것이 당신이 의미하는 것이라고 생각하는 것을 의미하지 않는다고 생각합니다 ... – annakata

답변

14

제 자신의 프로젝트에서 이것은 어떻게 페이지를 나눈 것입니까? 내 XSL 각각에서 으로 가져온 template.xsl 파일이 있습니다. 대부분의 페이지에는 template.xsl이 있었지만 카트와 같은 일부 페이지는 구문 분석하는 데이터가 다르기 때문에 이 필요했습니다.

<page title="Home"> 
    <navigation> 
     <!-- something here --> 
    </navigation> 
    <main> 
     <!-- something here --> 
    </main> 
</page> 

내 template.xsl에서 발췌 한 내용입니다. 여기에 모든 일반적인 것들을 던져 넣은 다음 내 페이지에 을 통해 자신의 정보를 추가 할 수있는 기회를주었습니다.

<xsl:template match="/page" name="page"> 
    <html> 
    <head> 
     <title><xsl:value-of select="(@title)" /></title>   
     <xsl:call-template name="css" /> 
     <xsl:call-template name="script" /> 
    </head> 
    <body> 
     <xsl:call-template name="container" /> 
    </body> 
    </html> 
</xsl:template> 

내 CSS 태그가 어떻게 반응하는지 예입니다. css-extended. css라고하는만 호출하면 모든 페이지에 공통적으로 적용됩니다. 일부 페이지에는 더 많은 정보가 필요했습니다. 그 은 CSS 확장을 무시할 수 있습니다. 페이지가 템플릿을 호출하지만 어디에도 정의하지 않은 경우 call-template이 실패하기 때문에 필요합니다. 내 컨테이너가 비슷한 manner-- 일반적인 물건 일 것이다

<xsl:template name="css"> 
     <link rel="stylesheet" type="text/css" href="{$cssPath}reset.css" /> 
     <link rel="stylesheet" type="text/css" href="{$cssPath}style.css" /> 
     <link rel="stylesheet" type="text/css" href="{$cssPath}layout.css" /> 
     <xsl:call-template name="css-extended" /> 
    </xsl:template> 

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets --> 
    <xsl:template name="css-extended" /> 

정의 한 후 각 페이지 단지 구현을 제공 할 수있다. 기본 구현은 XSL에있었습니다. (content)

<xsl:template name="container"> 
     <div id="container"> 
      <xsl:call-template name="header" /> 
      <xsl:call-template name="content" /> 
      <xsl:call-template name="footer" /> 
     </div> 
    </xsl:template> 

    <xsl:template name="content"> 
     <div id="content"> 
      <div id="content-inner"> 
       <xsl:call-template name="sideBar" /> 
       <xsl:call-template name="main" /> 
      </div> 
     </div> 
    </xsl:template> 

    <xsl:template name="main"> 
     <div id="main"> 
      <xsl:apply-templates select="main" /> 
      <xsl:call-template name="main-extended" /> 
     </div> 
    </xsl:template> 

    <!-- This is meant to be blank. It gets overriden by implementing stylesheets --> 
    <xsl:template name="main-extended" /> 

<xsl:template name="footer"> 
     <div id="footer"> 
     <div id="footer-inner"> 
     <!-- Footer content here --> 
     </div> 
     </div> 
</xsl:template> 

그것은 나를 위해 아주 아름답게 작동했습니다. 내가 대답 할 수있는 질문이 있으면 알려주십시오.

+0

이것은 훌륭하고 정확하게 내가 찾고있는 것입니다. 감사합니다. –

+0

나는이 대답을 좋아한다. 좀 더 자세한 정보 : 템플릿 중 일부를 외부 파일에 넣으려면 Xinclude bortzmeyer

5

템플릿, 포함

Xsl은 다른 프로그래밍 언어와 매우 다릅니다. Its rule based.

XSLT에 대해 something을 읽은 다음 조금 더 물어볼 것을 권합니다.

+0

XSLT와 "작은 것"을 다루는 모든 튜토리얼 및 기타 등등은 구문에 중점을 둡니다. 그것을 사용하려면 어떻게 실제로 적용해야합니까? " –

2

페이지의 일부를 추상화하는 데 사용할 수있는 xsl Include 및 Import 문이 모두 있습니다. XSLT 자체는 태그 파일 유형 동작을 재현 할 수있는 종류의 것입니다. 원하는 태그로 xml 데이터 파일을 편집합니다. 그 사이에, 당신의 xsl 템플렛은 그 꼬리표를 가진 무슨을 알기 위하여려고하고 그 후에 그 (것)들을 만난다.

2

당신은 템플릿에게 이름을 부여하고 그들을 통해 호출 할 수 있습니다 탐구하는

멋진 영역 (나는 고통스러운 구문을 찾을 수 있지만)

당신이 당신의 자신의 함수를 만들 수 있습니다 XSLT 2.0이다 '템플릿 전화' XSLT 스타일 시트를 생성하기 위해 XSLT 사용하기. 이를 통해 스타일 시트의 90 %가 상용구 인 일반적인 변환 시나리오를 자동화 할 수 있습니다. 이렇게하기 위해서는 '네임 스페이스 - 앨리어스'에 익숙해 져야합니다. 귀하의 언어 지식을 넓힐 수있는 좋은 방법입니다.

+0

XSLT -> XSLT에 관해서 당신이 여기서 말한 것을 알아내는 데 샤워가 필요했지만, 마침내 나는 그것을 포착했습니다. 그것은 매우 영리합니다. XSLT가 충분히 추상적이지 않다면 XML이기 때문에 더 추상적으로 만드십시오. 그들이 말하는 것처럼 "음식에 대한 코드를 작성하는 코드를 작성합니다." 고맙습니다. –

+0

걱정하지 마시고 - 예를 들어 주시겠습니까? –

1

XSLT는 강력하지만 대부분의 프로그래밍 언어와 매우 다르며 사용자가 사용할 수있는 언어가 매우 제한적이므로 다른 언어로 기본 제공되는 것들이 작동하려면 아주 복잡한 xsl 조작이 필요할 수 있습니다 와. 내가 XSLT 작업을 2 주 전 다시 시도 할 때 유용한 the cheatsheet from here을 발견했습니다.

XSLT가 특정 방식으로 작업을 수행하고 이러한 작업을 수행하는 좋은 방법을 찾을 수는 없지만 어떤 방식으로 작동해야하는지에 대한 생각이 너무 많으면 쉽게 걸릴 수 있습니다.

+0

이 있습니다. 항상 도전 과제입니다. 당신은 이전의 경험을 가지고 새로운 것을 적용하려고 노력합니다. 나는 XSLT가 세계에 대한 다른 견해를 가지고 있음을 알고 있지만, 사람들은 비슷한 문제를 해결해야한다는 것을 알고 있었고, 어떻게 진행되었는지 궁금했다. –

2

XSL은 템플릿 화시 기반입니다.

XML 데이터는 3 단계에서 "재사용"할 수 있습니다. 가장 기본적인 수준에서는 XML을 통해 <xsl:for-each />을 사용할 수 있습니다.

참고 : XSL의 각 요소는 데이터를 반복하지 않으므로 데이터와 일치합니다. 또한 "내부"가 XML의 "컨텍스트"인 경우 (프로그래밍의 "범위"개념과 비슷 함)

for-each를 사용하고 다시 사용하는 예

<xsl:for-each select="/xml/data/here"> 
    ... do some stuff ... 
</xsl:for-each> 
<xsl:for-each select="/xml/data/here"> 
    ... do some DIFFERENT stuff ... 
</xsl:for-each> 

for-each 노드는 템플릿 노드 (재사용의 두 번째 레벨)에 포함됩니다. 템플릿 노드에는 일치 노드와 명명 된 노드의 두 가지 유형이 있습니다. 일치 템플릿 노드는 위에서 언급 한 for-each 노드와 같이 작동하지만 XSL 처리가 시작될 때 노드가 일치하면 템플릿 엔진에서 자동으로 호출됩니다. 일치 템플릿 노드를 명시 적으로 적용 할 수도 있습니다. 반면에 명명 된 템플릿 노드는 항상 명시 적으로 적용되며 동일한 함수로 생각할 수 있습니다. (루트 노드는 항상 존재하기 때문에) 항상가 호출 될 일치 템플릿의

<xsl:template match="/"> 
    ... do some stuff ... 
</xsl:template> 

다른 일치하는 템플릿을 명시 적으로

<xsl:template match="/"> 
    <xsl:apply-templates select="xml/data/too" /> 
</xsl:template> 

<xsl:template match="xml/data/too"> 
    ... do something ... 
</xsl:template> 

주의를 촉구하는 일치 템플릿 :에서 일치 템플릿이 작동하려면 XML 노드가 일치해야합니다. 일치하지 않으면 템플릿이 이 아니고이 호출됩니다.명명 된 템플릿

<xsl:template name="WriteOut"> 
    ... data with NO Context Here ... 
</xsl:template> 

아니면 일치하는 템플릿에서

<xsl:template match="/"> 
    <xsl:call-template name="WriteOut" /> 
<xsl:template> 

참고 명명 된 템플릿을 호출

예 : 당신이, 당신이 단지에서 템플릿을 일치하고 이름이 호출 어디 믹스 앤 매치 할 수 있습니다 어떤 컨텍스트인지 확인해야합니다.

템플릿 노드는 모두 XSL 스타일 시트에 보관되어 있고 에는수입품 다양한 스타일 시트가 포함됩니다. 예를 들어 하나의 템플리트에 HTML 헤더 노드를 다루는 모든 템플리트와 다른 템플리트에서 HTML 본문 노드를 다루는 모든 템플리트를 보유 할 수 있습니다. 그런 다음 머리글 및 본문 스타일 시트를 모두 포함하는 하나의 스타일 시트를 만들 수 있습니다. 의

예 피 eaching, 템플릿을 통해 또는 관통 포함 스타일을 통한 데이터의 청크를 추출하는 방법은 세 가지가있다 결론적

<xsl:include href="header.xsl" /> 

노드를 포함한다.