2012-11-27 2 views
2

XSLT (2.0) 파일이 있습니다. 이는 입력 XML 데이터 파일을 받아 DDL/SQL 문을 작성합니다. 잘 작동합니다. 이 같은 'CONCAT'문에서 서식 정보가 많이 들어 있으므로 그러나, 유지하기 조금 어려운 :이 같은 방식으로 내 SQL 문을 인코딩하는 것입니다 수행하는 것을 선호 무엇Velocity와 같은 다른 템플릿 엔진과 유사한 템플릿 용 관용구?

<xsl:value-of select="concat('CREATE USER ',$username,' IDENTIFIED BY ',$password,';',$nl)"/> 

대신 : 나는 아마도하여 XSLT 중 하나 또는 iself 데이터 문서 (상단에 '조회'테이블의 XML 데이터 파일 자체에 이상이 형식을 유지하는 것

<some-enclosing-elements>[...]CREATE USER <username/>, identified by <password/>; [literally a newline here][...]</some-enclosing-elements> 

은 아직 밖으로있는 작동하지 않을 수 있습니다).

이런 종류의 템플릿을 허용하는 표준 관용구가 있습니까? 아이디어가 있으십니까?

그건 그렇고; 데이터 문서에는 많은 다양한 사용자가 포함되어 있습니다.

+1

' textnode 텍스트 노드 ...' – xiaoyi

답변

2

AVT 접근 방식은 내 취향에 너무 조금 어둡습니다. 필자는 암시 적 연결에 의존하는 경향이 있습니다 (2.0) XSL로 : 가치의 :

<xsl:value-of select="'CREATE USER', $username, 'identified by', $password"/> 

텍스트 템플릿의이 종류는 기본적으로 XSLT에서 내 자신의 템플릿 엔진을 작성하는 것입니다 중요하다 내가 응용 프로그램에서 사용했던 또 다른 방법;

형식의 메시지 템플릿을 포함하는 "메시지 파일"을 만든 다음 매개 변수를 대체하여 메시지를 확장하는 템플릿 규칙을 작성하십시오.

+0

감사합니다 - 암시 적 연결에 대해 알지 못했습니다. 두 번째 제안에 따라 데이터, 메시지 + 템플릿 아이디어를 제공 할 것입니다. 건배 John – monojohnny

+0

좋은 지적 ... 나는이 목적을 위해 암시 적 concat을 사용하는 것을 생각하지 않았습니다. 제가 제안한 것보다 더 우아합니다. – LarsH

1

@ xiaoyi가 맞아요. concat()을 사용하는 주요 대안을 보여줍니다. 그러나 <xsl:value-of select="..." />을 계속 반복해야하기 때문에 concat()보다 더 많은 표기법이 적용됩니다.

좋은 대안은 attribute value templates (AVTs)를 사용하는 것입니다 :

[...]CREATE USER {username}, identified by {password}; 
[...] 

그러나 ATVS는 텍스트 노드 (직접)에 대한 속성 (일부) 만 사용할 수 없습니다. 이러한 목적으로 어떻게 그들을 사용합니까?

XSLT 2.0의 한 가지 방법은 AVT를 사용하여 속성이있는 새로운 리터럴 결과 요소를 만드는 것입니다. AVT를 사용하여 해당 속성의 값을 지정하십시오.

<xsl:variable name="query"> 
    <dummy val="[...]CREATE USER {username}, identified by {password}; 
[...]" /> 
</xsl:variable> 
<xsl:value-of select="$query//@val" /> 

예 그 포맷 스트링 당 몇 가지 중요한 오버 헤드하지만 문자열 내에서 필드 당 오버 헤드가 거의 거기 : 다음 새 속성의 값을 선택합니다. 이처럼 함께 몇 가지 문자열을 할 수있는 :

<xsl:variable name="queries"> 
    <q val="[...]CREATE USER {username}, identified by {password}; &#10;[...]" /> 
    <q val="[...]CREATE TABLE {tablename}, blah blah; &#10;[...]" /> 
</xsl:variable> 
<xsl:value-of select="$queries/q[1]/@val" /> 
<xsl:value-of select="$queries/q[2]/@val" /> 

당신은 위와 같이 위치 인덱스를 사용하거나 각 문자열을 식별하기 id 속성을 사용할 수 있습니다.

나는이 방법이 다른 곳에서 옹호 된 것을 보지 못했기 때문에 다른 사람들이 그것에 대해 어떻게 생각하는지 듣고 싶습니다. 마이클 케이의 대답, 내가 이런 식으로 일을 어느 시점이 있다고 생각하지 않습니다에 의해 표시되는 간단한 방식을 감안할 때를 제외하고

신경 쓰지 마 ...

. 나는 왜 다른 사람들이이 방법을 옹호하지 않았는지 설명한다. :-)

XSLT 2.0을 사용할 수 없지만 nodeset() 확장 기능 (예 : IE 또는 .NET 환경)에 대한 액세스 권한이있는 경우에만이 접근 방식을 사용할 수있는 상황을 생각할 수 있습니다.). 이 경우 / 전에 XPath 표현식에서 사용했을 때 nodeset()$queries으로 감쌀 필요가 있습니다.

+0

흥미로운 아이디어! 건배 John – monojohnny