2013-05-19 2 views
1

xslt 스펙을 보면 캐릭터 맵이 전체 문서에 적용되는 것처럼 보입니다. 비트는 주어진 노드 나 템플릿에서 사용할 수 있습니까?주어진 노드에 문자표를 적용 할 수 있습니까?

예 : 노드에 조회 값이 포함되어 있지만 다른 템플릿에서 정규 표현식을 사용할 때 잘 재생되지 않는 문자가 포함될 수 있습니다. 지금은 대체 기능을 사용합니다. 그러나 몇 가지 문자를 읽거나 유지하기가 어려워졌습니다. 그래서 내가 이런 것을 가지고 있다면 :

<xsl:variable name="myLookup" select=" 
replace(
replace(
replace(
replace(
string-join(/*/lookup/*, '|'), 
'\[','\\['), 
'\]','\\]'), 
'\(','\\('), 
'\)','\\)') 
"/> 

다음과 같은 가상의 예제를 얻을 수있는 방법이 있습니까?

<xsl:character-map name="escapechar"> 
    <xsl:output-character character="[" string="\[" /> 
    <xsl:output-character character="]" string="\]" /> 
    <xsl:output-character character="(" string="\(" /> 
    <xsl:output-character character=")" string="\)" /> 
</xsl:character-map> 

<xsl:variable name="myLookup" select="string-join(/*/lookup/*, '|')" use-character-map="escapechar"/> 

저는 이것이 전혀 작동하지 않는다는 것을 알고 있습니다. 제 요청을 조금 비주얼하게 만드는 것입니다.

아이디어가 있으십니까?

답변

0

XSLT 2.0의 문자표는 결과 트리가 파일이나 스트림으로 직렬화 될 때 적용될 직렬화 기능이라고 생각하여 변형 중에 특정 문자열이나 특정 노드에 어떻게 적용 할 수 있는지 보지 못합니다 .

정규식 패턴의 메타 문자를 이스케이프 처리하는 경우 http://www.xsltfunctions.com/xsl/functx_escape-for-regex.html이 도움이 될 수 있습니다.

1

문자표는 직렬화 기능 일 뿐이며 변환의 최종 출력이 생성 될 때만 실행됩니다. 그러나 현재 코드를 크게 단순화 할 수 있습니다. 이러한 변화는 다음과 같은 XML 문서에 적용되는

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/*"> 
    <xsl:value-of select="my:escape(.)"/> 
</xsl:template> 

<xsl:function name="my:escape" as="xs:string"> 
    <xsl:param name="pStr" as="xs:string"/> 

    <xsl:value-of select="replace($pStr, '(\[|\]|\(|\))','\\$1')"/> 
</xsl:function> 
</xsl:stylesheet> 

:

<t>([a-z]*)</t> 
여기
replace($pStr, '(\[|\]|\(|\))','\\$1') 

완전한 예를입니다 :

그냥 사용 16,

원하는 정확한 결과가 생성됩니다

\(\[a-z\]*\) 
관련 문제