2009-08-03 2 views
3

단일 문자열을 기반으로 출력을 생성하고 매개 변수를 통해 전달되며 입력 XML 문서를 사용하지 않는 템플릿을 만듭니다. xsltproc은 스타일 시트를 지정하는 단일 매개 변수로 기꺼이 실행되는 것처럼 보입니다.하지만 입력 파일없이 템플릿을 트리거하는 방법은 없습니다 (예 : xsltproc, 명명 된 템플릿을 실행하는 매개 변수 없음).XSLT : 입력 파일이 없을 때 템플릿을 어떻게 트리거합니까?

나는 실행할 수 있도록하고 싶습니다 :

xsltproc --stringparam bar baz foo.xsl 

을하지만 현재 "주"템플릿 매칭 "/"로, 실행하는 데 :

echo '<xml/>' | xsltproc --stringparam bar baz foo.xsl - 

어떻게 이거 작동 시키니? 과거에는 입력 문서 없이도 실행될 수있는 다른 템플릿을 보았습니다.하지만 어떻게 작동했는지 또는 다시 찾을 수있는 위치를 기억하지 못합니다. :-)

+0

허용되는 대답이 실제로 올바르지 않습니다. 자세한 내용은 내 대답을 참조하십시오. –

+0

이 XSLT 1.0 기술이 실제로 어떻게 사용되는지 보여주기 위해 제 대답을 업데이트했습니다. –

답변

8

실제로 이것은 매우 자주 수행되었습니다.

XSLT 2.0에서 이것은 Spec. 초기 컨텍스트 노드를 제공하는 것은 선택 사항입니다. 초기 컨텍스트 노드가 제공되지 않은 경우 (소스 XML 문서 없음), 변환의 시작점으로 실행될 명명 된 템플리트의 이름을 제공하는 것이 중요합니다. XSLT 1.0 하나에서

원본 XML 문서로 변환에는 주 스타일 시트 모듈 (파일)에 제공 할 수 있습니다, 물론, 변환은 완전히이 소스 XML 문서를 무시할 수 있습니다. 이 기술은 오래 전에 시연되고 사용되었습니다. Jeni Tennison. 위의 코드는 윈도우 탐색기에서 파일을 두 번 클릭으로 표시됩니다 "example.xml"다음 폴더 내용라는 이름의 파일에 저장됩니다

<?xml-stylesheet type="text/xsl" href="example.xml"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <p>Hello, world!</p> 
    </xsl:template> 
</xsl:stylesheet> 

"예 : 예를 들어

.xml "은 IE를 열고 생성합니다 :

안녕하세요!

+0

XSLT 1.0의 경우'document ('')'를 사용하는 것이 좋을까요? 나는 Jeni의 사이트를 훑어 보았지만 이것에 대한 예제를 찾을 수 없었다. 그리고 겉보기에 명백한 해결책 ('document()'템플릿의'match ='속성 포함)은 libxslt와 Xalan- 제이 예제에 대한 직접 링크가 있습니까? –

+0

@ ben-blank 답변을 업데이트했으며 현재 예제가 포함되어 있습니다. 설명 된대로 XSLT 스타일 시트를 저장하면 Windows 탐색기 내에서 XSLT 스타일 시트를 두 번 클릭하면 변환이 수행되고 결과는 IE에 표시됩니다. 확실히, 별도의 입력 파일이 사용되지 않았으며 실제로 스타일 시트 자체가 입력 파일로 사용되었습니다. Jeni는이 기술을 사용하는 연습을했습니다. –

+0

작동! 확장을 "xml"로 변경할 필요조차 없었습니다. (음,'xsltproc'을 위해, 어쨌든 - 나는 IE로 시도하지 않았다.) –

1

일반적으로 XSLT에서는이 작업을 수행 할 수 없습니다. 입력 문서가 있어야하며 사용 가능한 템플릿을 루트 노드에 적용해야합니다. 일부 XSLT 프로세서는 원하는대로 (예 : 명명 된 템플릿을 실행하는) 확장 기능을 제공하지만, 그와 같은 것은 모릅니다. xsltproc이 맨 페이지에서 볼 때 그 중 하나 인 것처럼 보이지 않습니다 .

실제로 이것은 일반 문자열 입력에서 일부 출력을 생성하기 위해 XSLT를 사용하는 목적이 명확하지 않으므로 일반적으로 상당히 모호하게 들립니다. 일반적으로 잘하는 작업이 아닙니다.

+0

+1 - 루트 노드조차 없다면 call-template이나 apply-templates가 일치 할 수 없습니다. –

+0

기술적으로 명명 된 템플릿은 아무 것도 "매치"할 필요가 없으므로 수행 할 수 있습니다. 그리고 XSLT 2.0에서는 (현재'xsl : function' 내에서'xsl : call-template'을 사용하는 경우) 현재 컨텍스트 노드가없는 템플릿을 실행할 수도 있습니다. –

+0

그것은 이상한 요구 사항입니다.나는 그들이 원래의 게시물에서 옵션 2에 만족해야한다고 말했을뿐입니다. :-) –

관련 문제