이것은 쉽지 만 알아낼 수는 없습니다.다음 반복에서 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>
감사합니다. 나는 편집자가 저에게 그것을 지적하기를 바랬습니다. 아! 나는 그것에 많은 시간을 낭비했다.
예, xsl : if를 몇 xsl : choose 문으로 변경했습니다. 다시 한번 검토해 주셔서 감사합니다. – liv2luv