문제

일반 표현식에 실제로 적합한 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,- ')
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top