2012-01-05 2 views
2

(나 프로토콜을 불쾌하게 나를 당황하게 수있는 일반적인 전략 질문 위험을 감수하겠습니다.) HTML로 내 입력 XML의 원소 별 변환하기 전에XSLT 1.0 예비 처리 전략은

을, 나는 순서를 결정해야 어떤 요소들이 제시 될 것인가. 이렇게하려면 순서가 지정된 목록을 병합하고 그래프를 추적하는 등 재귀 적 분석이 필요합니다. 모든 요소는 표시 할 요소의 특성을 기반으로합니다.

그 처리가 끝나면 사실상 속성 값의 정렬 된 목록을 갖게되고 그 목록으로 정렬 된 요소를 표시합니다.

어떤 전략이 더 좋습니까?

1) 속성 값리스트 될 전역 변수로 미리 분석 결과를 넣은 다음, 그리스트를 통해 같은 반복 :

<xsl:variable name=orderOfPresentation> 
    <xsl:call-template name="analyses"> 
</xsl:variable> 


<xsl:template match="root"> 
    <xsl:for-each select="$orderOfPresentation"> 
     <xsl:apply-templates select="/" /> 
    </xsl:for-each> 
</xsl:template> 

또는

2) 재귀을 닫지 않고, 이런 식으로 뭔가를 정렬 된 목록이 결정되면 분석, 깊은 템플릿의 서식을 적용합니다

<xsl:template match="root"> 
    <xsl:call-template name="analysis"> 
     [with, as parameters, various sets of attribute nodes, extracted from the input XML] 
    </xsl:call-template> 
</xsl:template> 


<xsl:template name="analysis"> 
    [recursions that include calls to sub-analysis] 
</xsl:template> 

<xsl:template name="sub-analysis"> 
    [recursions that include calls to sub-sub-analysis]] 
</xsl:template> 

<xsl:template name="sub-sub-analysis"> 
    [more work, which eventually produces an ordered list, $orderOfPresentation] 
    <xsl:for-each select="$orderOfPresentation"> 
     <xsl:apply-templates select="/" /> 
    </xsl:for-each> 
</xsl:template> 

은 F 첫 번째 전략은 절차 언어 프로그래머의 생각을 드러내지 만 실제 변환의 비즈니스를 시작하기 전에 프로세서가 스스로를 정리할 수있는 이점이있는 것처럼 보입니다.

그러나 XLST 1.0 (확장 기능없이 작동해야 함)은 문자열 값 목록을 나타내는 간단한 방법이 없으며 (이것이 올바르게 이해 된 경우) 전역 변수에만 결과를 전달할 수 있습니다. 결과 트리 조각 (내가 이해하지 못하는 것). 따라서 전략 (1)은 나 빠진다.

(2) 재귀 내부에서 모든 실제 변환을 호출하는 전략은 비효율적이며 유지 관리가 어려워 보입니다.

이러한 전략 중 하나가 가장 좋습니다. 아니면 둘 다 혼란스런 정신의 증거일까요?

+0

XSLT 프로세서가 호출되는 환경은 어떻게 보입니까? 정렬을위한 첫 번째 XSLT 프로그램을 적용하고 결과 XML을 어딘가에 저장 한 다음 "XML to HTML"변환을 수행하는 두 번째 XSLT 프로그램을 통해이를 처리 할 수 ​​있습니까? 이것은 내가 여기서 시도 할 것입니다. –

+0

변환은 클라이언트 측 웹 브라우저에서 수행됩니다. 따라서 중간 XML을 저장할 수 없습니다. – JPM

+0

글쎄, 자바 스크립트에 대해 많이 알지는 못하지만, 자바 스크립트를 사용하여 제안한 것을 수행 할 수는 없습니까? XSLT 프로세서를 두 번 실행하기 위해 쉽게 수정할 수있는 것처럼 보이는이 예제 http://www.w3schools.com/xsl/xsl_client.asp가 나타납니다. –

답변

0

사전 처리에 필요한 결과이므로 문자열리스트 (속성 값들의 순서화 된리스트)이다

은 RTF는 나무 조각이 있다는 사실을 무시하고 단지 캐릭터처럼 취급한다. 호출 된 템플릿에서 XML 노드를 만들지 말고 값의 합을 구분 기호로 사용하여 문자열을 출력하십시오.

전역 변수는 실제로는 문자열 목록이됩니다. (기능 substring-before(, delimiter)substring-after(, delimiter) 목록에 대한 좋은 작은 팝업 기능을 형성 할 수있다.)

그래서 먼저 전처리를 마무리의 혜택을받을 (전략 1) 대신 깊은 전처리 내부에서 변화를 실행의 (전략 2) RTF가 아닌 정렬 된 문자열 목록으로 전역 변수를 생각하면됩니다.

+0

브라우저의 클라이언트 측 변환이므로 node-set() 확장에 의존 할 수 없습니다. 스타일 시트를 다른 사람들이 쉽게 사용하고 적응하고 유지할 수 있도록 Javascript를 피하고 싶습니다. 여기서의 전략은 경량이며 지금까지 잘 작동합니다. – JPM

1

Doc Brown과 마찬가지로 세 번째 전략을 사용할 것입니다 : 대상 스타일 시트를 생성 한 다음 실행하십시오. 브라우저에서 Javascript를 사용하여이 작업을 수행 할 수 있습니다.