2011-10-07 3 views
1

이것은 쉽지 만 알아낼 수는 없습니다.다음 반복에서 NodeSet으로 표시되는 문자열 - XSLT

'95'이전의 하위 문자열 길이가 짝수 인 경우 '95'를 '3F'로 바꿉니다. '95'이전의 하위 문자열 길이가 짝수가 아니면 하위 문자열의 값을 '95'의 값 '9'와 함께 취하고 95의 값을 다시 재귀 적으로 찾아 값을 대체하십시오.

최종 문자열은 '3F'

문자열 값이 'inputHex'변수에 할당로 대체 값을가집니다. replace95 템플릿을 호출하는 경우에도 'inputHexStr'에 전달됩니다. 주어진 문자열에서 '95'의 첫 번째 값은 134와 135 위치에서 발생합니다. 따라서 조건 (문자열 길이 (substring-before ($ inputHexStr, $ from) $ 2)이 호출됩니다. 문제는 ... 다음 번에 'replace95'템플릿을 string의 나머지 값으로 호출 할 때 문자열에 액세스 할 수 없으며 디버그가 노드 집합으로 표시됩니다.

왜 그럴까요?

업데이트 - 입력 XML의 경우 <x/>으로 다음 반복은 주어진 xml 파일의 루트 노드로 컨텍스트를 변경하고 inputHexStr의 값은 string 대신 nodeset으로 표시됩니다.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
     <xsl:variable name="inputHex" 
      select="'3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574662D3822203F3E3C783E74686973206973206120626164206368617261637465722019520737472696E6720646174613C2F7895'"/> 
     <xsl:variable name="hexResult"> 
      <xsl:call-template name="replace95"> 
       <xsl:with-param name="inputHexStr" select="$inputHex"/> 
      </xsl:call-template> 
     </xsl:variable> 
     <xsl:value-of select="$hexResult"/> 
    </xsl:template> 
    <xsl:template name="replace95"> 
     <xsl:param name="inputHexStr" select="."/> 
     <xsl:param name="from" select="'95'"/> 
     <xsl:param name="to" select="'3F'"/> 
     <xsl:choose> 
      <xsl:when test="not(contains($inputHexStr,$from))"> 
       <xsl:value-of select="$inputHexStr"/> 
      </xsl:when> 
      <xsl:otherwise> 

       <xsl:if test="string-length(substring-before($inputHexStr,$from)) mod 2 = 0"> 
        <xsl:value-of select="substring-before($inputHexStr,$from)"/> 
        <xsl:value-of select="$to"/> 
        <xsl:call-template name="replace95"> 
         <xsl:with-param name="inputHexstr" 
          select="substring-after($inputHexStr,$from)"/> 
         <xsl:with-param name="from" select="$from"/> 
         <xsl:with-param name="to" select="$to"/> 
        </xsl:call-template> 
       </xsl:if> 
       <xsl:if test="not(string-length(substring-before($inputHexStr,$from)) mod 2 = 0)"> 
        <xsl:variable name="no95part" 
         select="substring($inputHexStr,1,string-length(substring-before($inputHexStr,$from))+1)"/> 
        <xsl:value-of select="$no95part"/> 

        <xsl:variable name="no95Length" select="string-length($no95part)"/> 

         <xsl:call-template name="replace95"> 
          <xsl:with-param name="inputHexstr" select="substring($inputHexStr,$no95Length+1)"/> 
          <xsl:with-param name="from" select="$from"/> 
          <xsl:with-param name="to" select="$to"/> 
         </xsl:call-template> 

       </xsl:if> 

      </xsl:otherwise> 
     </xsl:choose> 


    </xsl:template> 

</xsl:stylesheet> 

답변

1

이것은 재귀 적으로 매개 변수가있는 템플릿을 호출 할 때 오타가 있다고 생각합니다.

<xsl:with-param name="inputHexstr" select=... 

당신은 소문자 여기에 있습니다. XSLT는 대소 문자를 구분하므로, 그것은 당신이 XLS을 결합 가치가있을 수도 있음을

<xsl:with-param name="inputHexStr" select=... 

주 자본 S되어야한다 : 하나의 XSL에 문 경우 : 선택은에 추가 계산을 피하기 위해 나머지

<xsl:choose> 
    <xsl:when test="not(contains($inputHexStr,$from))">...</xsl:when> 
    <xsl:when test="string-length(substring-before($inputHexStr,$from)) mod 2 = 0">...</xsl:when> 
    <xsl:otherwise>...</xsl:otherwise> 
</xsl:choose> 
+0

감사합니다. 나는 편집자가 저에게 그것을 지적하기를 바랬습니다. 아! 나는 그것에 많은 시간을 낭비했다.
예, xsl : if를 몇 xsl : choose 문으로 변경했습니다. 다시 한번 검토해 주셔서 감사합니다. – liv2luv