2012-10-09 2 views
1

에 대한 문자열 대안을 분석 1.0 XSL 2.0의 예를 들어 우리는 할 수 있습니다 :XSL XSL의 분석 문자열 작업을 수행 할 수있는 방법이 있나요 XSL 1.0

<xsl:analyze-string select="Description" regex="$param1"> 
    <xsl:matching-substring> 
    <span style="background-color: papayawhip;"> 
<xsl:value-of select="."/></span> 
    </xsl:matching-substring> 
    <xsl:non-matching-substring> 
    <xsl:value-of select="."/> 
    </xsl:non-matching-substring> 
    </xsl:analyze-string> 

그래서이 설명 노드 PARAM1를 찾습니다 <span>으로 바꿉니다. XSL 1.0에서 이와 같은 작업을 수행 할 수 있습니까?

+1

'$ param'은 어떻게 보이나요? 정규식 지원이 정말로 필요합니까? 아니면 단순히 랩하고자하는 문자열 상수를 찾고 있습니까? –

+0

이것은 단지 문자열 상수입니다. 그래서 기본적으로 검색 키워드 일뿐입니다. 설명 노드의 아무 곳에 나 나타나면 범위를 사용하여 강조 표시하고 싶습니다. – Vinit

답변

1

당신은 단순히 Description 요소에 문자열 찾고 싶을 경우, 즉 명명 된, 재귀 템플릿을 작성하여 XSLT 1.0 가능합니다 :

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:param name="param1" select="'foo'"/> 

<xsl:template name="wrap"> 
    <xsl:param name="input"/> 
    <xsl:param name="search"/> 
    <xsl:param name="wrapper-element" select="'span'"/> 
    <xsl:param name="wrapper-style" select="'background-color: papayawhip;'"/> 
    <xsl:choose> 
    <xsl:when test="not(contains($input, $search))"> 
     <xsl:value-of select="$input"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="substring-before($input, $search)"/> 
     <xsl:element name="{$wrapper-element}"> 
     <xsl:if test="$wrapper-style"> 
      <xsl:attribute name="style"> 
      <xsl:value-of select="$wrapper-style"/> 
      </xsl:attribute> 
     </xsl:if> 
     <xsl:value-of select="$search"/> 
     </xsl:element> 
     <xsl:call-template name="wrap"> 
     <xsl:with-param name="input" select="substring-after($input, $search)"/> 
     <xsl:with-param name="search" select="$search"/> 
     <xsl:with-param name="wrapper-element" select="$wrapper-element"/> 
     <xsl:with-param name="wrapper-style" select="$wrapper-style"/> 
     </xsl:call-template> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="Description"> 
    <div> 
    <xsl:call-template name="wrap"> 
     <xsl:with-param name="input" select="."/> 
     <xsl:with-param name="search" select="$param1"/> 
    </xsl:call-template> 
    </div> 
</xsl:template> 

</xsl:stylesheet> 

이러한를 코드를 변환 한 다음

<Root> 
    <Description>foo bar baz foobar test whatever foo</Description> 
</Root> 

<div><span style="background-color: papayawhip;">foo</span> bar baz <span style="background-color: papayawhip;">foo</span>bar test whatever <span style="background-color: papayawhip;">foo</span></div> 

예를 들어 사용자의 요구에 어떻게 든 적응할 수 있습니다. XSLT 2.0의 분석 문자열을 완전히 대체하는 것은 아닙니다.

2
같은

사용 무언가 :

<xsl:if test="contains(x, $param)"> 
    <xsl:value-of select="substring-before(x, $param)"/> 
    <span><xsl:value-of select="$param"/></span> 
    <xsl:value-of select="substring-after(x, $param)"/> 
</xsl:if>