2010-07-16 2 views
3

기본적으로 XSLT 템플릿을 사용하여 ASP.NET 마스터 페이지의 기능을 다시 만들려고합니다.xslt 템플릿의 결과를 param으로 다른 템플릿에 전달할 수 있습니까?

.xslt 파일에 저장된 많은 페이지 HTML을 포함하는 "마스터 페이지"템플릿이 있습니다. 다른 .xslt 파일은 페이지 데이터를 나타내는 xml을 사용하는 단일 페이지에만 해당됩니다. 내 새 템플릿에서 마스터 페이지 템플릿을 호출하고 싶지만 여전히 적용될 자체 XML을 삽입 할 수 있습니다. param을 이름으로 사용하여 템플릿을 호출 할 수있는 매개 변수를 전달할 수 있다면 트릭을 수행 할 수 있지만 허용되지 않습니다.

<xsl:template name="MainMasterPage"> 
    <xsl:with-param name="Content1"/> 
    <html> 
    <!-- bunch of stuff here --> 
    <xsl:value-of select="$Content1"/> 
    </html> 
</xsl:template> 

그리고이 : 기본적으로

나는 이것을 가지고

<xsl:template match="/"> 
    <xsl:call-template name="MainMasterPage"> 
    <xsl:with-param name="Content1"> 
     <h1>Title</h1> 
     <p>More Content</p> 
     <xsl:call-template name="SomeOtherTemplate"/> 
    </xsl:with-param> 
    </xsl-call-template> 
</xsl:template> 

무슨 일 중첩 된 XML은 기본적으로 제거하고 모든 삽입은 "TitleMore 내용"

+0

좋은 질문 (+ 1). 이 문제에 대한 설명과 올바른 해결 방법은 내 대답을 참조하십시오. –

답변

5

때문이다 제공된 코드의 문제점은 다음과 같습니다.

<xsl:value-of select="$Content1"/> 

이 출력됩니다 중 하나 $Content1의 최상위 노드 (이 문서가 포함 된 경우) 또는 첫 번째 요소 또는 텍스트 자녀의 문자열 값의 모든 텍스트 노드의 자손의 연결 (그것이 인 경우 XML 조각).

당신은

<xsl:copy-of select='$pContent1'>

대신

<xsl:value-of select='$pContent1'>의 사용해야합니다. 이러한 변화가 어떤 XML 문서 (사용되지 않음), 원하는, 올바른에 적용

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

<xsl:template match="/"> 
    <xsl:call-template name="MainMasterPage"> 
    <xsl:with-param name="pContent1"> 
     <h1>Title</h1> 
     <p>More Content</p> 
     <xsl:call-template name="SomeOtherTemplate"/> 
    </xsl:with-param> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="MainMasterPage"> 
    <xsl:param name="pContent1"/> 
    <html> 
    <!-- bunch of stuff here --> 
    <xsl:copy-of select="$pContent1"/> 
    </html> 
</xsl:template> 

<xsl:template name="SomeOtherTemplate"> 
    <h2>Hello, World!</h2> 
</xsl:template> 
</xsl:stylesheet> 

: 아래 $pContent1

이 제대로 복사 모든 자식 노드는 수정 된 변환입니다 결과가 생성됩니다. :

<html> 
    <h1>Title</h1> 
    <p>More Content</p> 
    <h2>Hello, World!</h2> 
</html> 
+0

+1, 좋은 답변입니다. 'copy-of' 대신에'apply-templates' (같은'select'와 함께)를 사용하여 템플릿을 중간 결과에 적용 할 수 있습니까? 나는 이것을 잠시 동안 작동 시키려고 노력했지만 불평은하지 않지만 결과는 단순히 비어 있습니다. – falstro

+0

@roe : 가능하지만 apply-templates는 적용 할 템플릿이 identity transform과 동일 할 때만 copy-of와 같습니다. –

+0

그게 내 문제는 내가 변환을 수행하려고 노력하고 그 결과 위에 또 다른 변환 (한 변환은 텍스트 내용을 수정하고 너비가 0 인 공백 문자를 삽입하며 두 번째 변환은 마크 업을 수행한다는 것입니다. , 예를 들어 fo-inline 블록), 결과는 어떤 이유로 비어 있습니다. – falstro

관련 문제