문제

XSLT에서 '전구'가 가능합니까?

전처리와 함께 소스 트리의 (메모리 표현) 업데이트를 의미합니다.

이것이 가능합니까, 아니면 여러 가지 변환을 수행해야합니까?

유스 케이스 : 우리는 클라이언트를위한 문서 참조 매뉴얼이 있지만 특정 클라이언트의 경우 다른 '스킨'(다른 이미지 등)이 필요합니다. 그래서 내가 바라는 것은 이미지를 변형시키는 것입니다. fileref 매개 변수에 따라 경로. 그런 다음 나머지 정상적인 문서 XSL 템플릿을 적용하십시오.

도움이 되었습니까?

해결책

Eamon의 답변 확장 ...

XSLT 1.0 또는 2.0의 경우 중간 (사전 처리) 결과를u003Cxsl:variable> 전 세계 (최상위) 또는 로컬 (템플릿 내부)을 선언 한 요소.

<xsl:variable name="intermediate-result">
  <!-- code to create pre-processed result, e.g.: -->
  <xsl:apply-templates mode="pre-process"/>
</xsl:variable>

XSLT 2.0에서 $ 중간 분류 변수의 값은 하나의 문서 노드 (XSLT/XPATH 1.0에서 "루트 노드"라고 함)로 구성된 노드 시퀀스입니다. 다른 변수와 마찬가지로 액세스하고 사용할 수 있습니다.

그러나 XSLT 1.0에서 $ 중간 분류 변수의 값은 일류 노드 세트가 아닙니다. 대신, 그것은 "결과 트리 조각"이라고 불리는 것입니다. 하나의 루트 노드를 포함하는 노드 세트처럼 작동하지만 사용 방법은 제한됩니다. 그것을 복사하고 문자열 값을 얻을 수 있지만 select = "$ Intermediate-Result/Doc"에서와 같이 xpath를 사용하여 드릴 다운 할 수 없습니다. 이를 위해서는 먼저 프로세서의 노드 세트 () 확장 기능을 사용하여 일류 노드 세트로 변환해야합니다. Saxon 6.5, libxslt 및 4xslt에서는 Exsl : node-set () (Eamon의 답변에서와 같이)를 사용할 수 있습니다. MSXML에서는 msxsl : node-set (), 여기서 xmlns : msxsl = "urn : schemas-microsoft-com : xslt"를 사용해야합니다. 하이픈이지만 네임 스페이스 URI를 위해 Google에 있어야합니다). 예를 들어 : select = "exsl : node-set ($ intermediate-result)/doc"

XSLT 2.0은 단순히 결과 트리 조각을 폐지하여 node-set ()를 불필요하게 만듭니다.

다른 팁

표준 준수 XSLT 1.0에서는 불가능합니다. 그러나 내가 사용한 모든 실제 구현에서 가능합니다. 그러나이를 수행하는 확장은 엔진마다 다릅니다. 표준 XSLT 2.0에서도 가능합니다 (어쨌든 작업하기가 훨씬 쉽습니다. 가능하다면 사용하십시오).

XSLT 프로세서가 지원되는 경우 exslt,, exsl : node-set () 기능은 찾고있는 일을합니다. MSXML은 동일하게 명명 된 확장 기능을 가지고 있지만 다른 네임 스페이스 URI를 사용하면 불행히도 기능은 사소하게 호환되지 않습니다).

동일한 Docbook XML 소스에서 약간 다른 출력을 생성하려고하므로 Docbook XSL 스타일 시트의 "프로파일 링"(조건부 마크 업) 지원을 살펴 보겠습니다. 보다 26 장 안에 Docbook XSL : 완전한 가이드 Bob Stayton :

프로파일 링은 조건부 텍스트를 설명하기 위해 문서에서 사용되는 용어입니다. 조건부 텍스트는 일부 요소가 조건부로 표시된 단일 XML 문서를 만들 수 있음을 의미합니다. 이러한 문서를 처리 할 때 해당 버전의 출력에 적용되는 조건을 지정할 수 있으며 스타일 시트에는 조건을 충족시키기 위해 표시된 텍스트를 포함하거나 제외합니다. 이 기능은 둘 이상의 버전의 문서를 생성해야 할 때 유용하며 버전은 사소한 방식으로 다릅니다.

예를 들어, 동일한 문서의 Windows 및 Mac 버전에 다른 이미지를 사용하려면 다음과 같은 문서 XML 조각이있을 수 있습니다.

<figure>
  <title>The Foo dialog</title>
  <mediaobject>
    <imageobject os="windows">
      <imagedata fileref="screenshots/windows/foo.png"/>
    </imageobject>
    <imageobject os="mac">
      <imagedata fileref="screenshots/mac/foo.png"/>
    </imageobject>
  </mediaobject>
</figure>

그런 다음 Docbook XSL 스타일 시트의 프로파일 링 지원 버전을 profile.os 매개 변수로 설정되었습니다 windows 또는 mac.

XSLT "OOP"메소드를 여기에서 사용해야 할 수도 있습니다. 모든 일반 템플릿을 스타일 시트에 모든 클라이언트에 넣고 공통 템플릿을 우선적으로 사용하여 각 클라이언트에 대한 스타일 시트를 만듭니다. XSL : Import를 사용하여 특정 스타일 시트를 가져 오면 클라이언트에 해당하는 스타일 시트를 호출하여 하나의 처리 만 수행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top