2012-12-20 2 views
3

매개 변수에서 일부 텍스트를 선택하여 변수에 넣으려고합니다.이 변수에는 일반 텍스트 만 있습니다.XSLT를 사용하여 param에서 정확한 단어를 찾으십니까?

<xsl:variable name="Underline"> 
    <xsl:choose> 
    <xsl:when test="contains($style-name, 'u')">true</xsl:when> 
    </xsl:choose> 
</xsl:variable> 

이 매개 변수 ($ 스타일의 이름)의 값은에서 아무것도 또는 파업, 안에, U, 강한 서브, 그리고 한모금의 조합이 될 수 있습니다.

$style-name: "strike em u sub"

문제 내가 위의 코드를 사용할 때 또한 문자 U를 발견하기 때문에 하위U가 같은 생각이다. 이것은 들어있는 내용입니다.

나는 여기에 몇 가지 조사를했는데 :

http://www.w3.org XPATH

XPath to return only elements containing the text, and not its parents

하지만 나를 위해 작동 아무것도 찾을 수 없습니다. 추가 정보가 필요하면 알려주십시오.

이것은 또한 XSLT 1.0에만 해당됩니다. Visual Studio 2012를 사용하고 있는데 엔진이 무엇인지 100 % 확신 할 수 없습니다.

나는 입력을 제공 할 수 있지만 문제의 범위를 벗어나서 그저 문제가된다.

<xsl:when test="tokenize($style-name,' ') = 'u')">true</xsl:when> 

이 시퀀스에 공백으로 구분 된 모든 토큰으로 변환되며, = 'u'는 경우 일치합니다 :

답변

4

실제로 토큰 화가 필요하지 않습니다.그것은이처럼 간단해야한다 :

<xsl:variable name="Underline"> 
    <xsl:if test="contains(concat(' ',$style-name,' '),' u ')">true</xsl:if> 
</xsl:variable> 

또는 어쩌면 당신이 공간이 구분 된 목록이 보장 않다면입니다

<xsl:variable name="Underline"> 
    <xsl:if test="contains(concat(' ',normalize-space($style-name),' '),' u ')">true</xsl:if> 
</xsl:variable> 

더 나은.

4

XSLT 2.0 솔루션

토큰의 순서에 침입 =를 사용하여 비교 어떤 토큰도 'u'와 일치합니다.

XSLT 1.1 솔루션

<xsl:template name="tokenize"> 
    <xsl:param name="token" /> 
    <xsl:param name="text"/> 
    <xsl:if test="string-length($text)"> 
    <token><xsl:value-of select="substring-before(concat($text,$token),$token)"/></token> 
    <xsl:call-template name="tokenize"> 
     <xsl:with-param name="text" select="substring-after($text,$token)"/> 
     <xsl:with-param name="token" select="$token"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

... 

<xsl:variable name="tokens"> 
    <xsl:call-template name="tokenize"> 
    <xsl:with-param name="text" select="$style-name"/> 
    <xsl:with-param name="token" select="' '"/> 
    </xsl:call-template> 
</xsl:variable> 

<xsl:when test="$tokens/token = 'u'">true</xsl:when> 

XSLT 1.0 솔루션

은 (MSXSL 포함한) 모든 주요 XSL 프로세서에 포함 된 확장이 필요.

xmlns:msxsl="urn:schemas-microsoft-com:xslt" 

을 그리고 @Test 변경 : 스타일 시트에이 네임 스페이스 선언을 추가

ESLT 인식 프로세서
<xsl:when test="msxsl:node-set($tokens)/token = 'u'">true</xsl:when> 

이 (색슨, xsltproc,의 Xalan-J, jd.xslt 및 4XSLT) 사용을 xmlns:exsl="http://exslt.org/common"exsl:node-set(). Xalan-C의 경우 xmlns:xalan="http://xml.apache.org/xalan"xalan:nodeset()을 사용하십시오.

관련 문제