문제
일반 표현식에 실제로 적합한 XSLT 1.0을 사용하여 찾기 및 교체를 수행해야합니다. 불행히도 이것들은 1.0에서 사용할 수 없으며 변경할 수없는 보안 설정으로 인해 EXSLT와 같은 확장 라이브러리를 사용할 수 없습니다.
내가 작업하고있는 문자열은 다음과 같습니다.
19;#John Smith;#17;#Ben Reynolds;#1;#Terry Jackson
숫자를 교체해야합니다 ; #
a ,
. 예를 들어 위는 다음으로 변경됩니다.
John Smith, Ben Reynolds, Terry Jackson
재귀 적 문자열 함수가 필요하다는 것을 알고 있습니다. 아마도 서브 스트링 및 번역을 사용하여 아마도 어디서부터 시작 해야할지 잘 모르겠습니다.
누구든지 이것을 해결하는 방법에 대한 조언이 있습니까? 내가 시작한 내용은 다음과 같습니다.
<xsl:template name="TrimMulti">
<xsl:param name="FullString" />
<xsl:variable name="NormalizedString">
<xsl:value-of select="normalize-space($FullString)" />
</xsl:variable>
<xsl:variable name="Hash">#</xsl:variable>
<xsl:choose>
<xsl:when test="contains($NormalizedString, $Hash)">
<!-- Do something and call TrimMulti -->
</xsl:when>
</xsl:choose>
</xsl:template>
해결책
나는 당신이 그렇게 질문하기 위해 문제를 너무 단순화하지 않았기를 바라고 있습니다. 왜냐하면 이것이 그다지 많은 문제가되어서는 안됩니다.
입력 문자열의 형식을 일관성있게 유지하는 한 템플릿을 정의하고 재귀 적으로 호출 할 수 있습니다.
예를 들어,
<xsl:template name="TrimMulti">
<xsl:param name="InputString"/>
<xsl:variable name="RemainingString"
select="substring-after($InputString,';#')"/>
<xsl:choose>
<xsl:when test="contains($RemainingString,';#')">
<xsl:value-of
select="substring-before($RemainingString,';#')"/>
<xsl:text>, </xsl:text>
<xsl:call-template name="TrimMulti">
<xsl:with-param
name="InputString"
select="substring-after($RemainingString,';#')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$RemainingString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
다음 호출 로이 템플릿을 테스트했습니다.
<xsl:template match="/">
<xsl:call-template name="TrimMulti">
<xsl:with-param name="InputString">19;#John Smith;#17;#Ben Reynolds;#1;#Terry Jackson</xsl:with-param>
</xsl:call-template>
</xsl:template>
다음과 같은 출력을 받았습니다.
John Smith, Ben Reynolds, Terry Jackson
그것은 당신이 추구하는 것 같습니다.
기능 프로그래밍에 익숙하다면 그것이하는 일에 대한 설명은 설명하기 쉽습니다. 그만큼 InputString
매개 변수는 항상 형태입니다 [number];#[name];#[rest of string]
. 각각의 호출 TrimMulti
템플릿은 [number];#
부분과 인쇄 [name]
부분은 나머지 표현을 재귀 적으로 전달합니다.
기본 케이스는 언제입니다 InputString
형식에 있습니다 [number];#[name]
,이 경우 RemainingString
변수에는 포함되지 않습니다 ;#
. 우리는 이것이 입력의 끝이라는 것을 알고 있기 때문에 이번에는 쉼표를 출력하지 않습니다.
다른 팁
';'라면 그리고 '#'문자는 구분기이기 때문에 입력에서 유효하지 않습니다. 그렇다면 왜 번역 기능이 작동하지 않습니까? 추악 할 수 있지만 (두 번째 인수에 모든 유효한 문자를 지정하고 세 번째 인수에서 반복해야 함) 디버그하기가 더 쉬울 것입니다.
translate($InputString, ';#abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUZ0123456789,- ', ', abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUZ0123456789,- ')