Строка, отображаемая как NodeSet в следующей итерации - XSLT - PullRequest
1 голос
/ 07 октября 2011

Это должно быть легко, но я не могу понять это.

Цель - заменить «95» на «3F», если длина подстроки перед «95» является четным числом.Если длина подстроки до '95' не является четным числом, примите значение подстроки вместе со значением '9' в '95' и начните рекурсивно искать вхождение 95 для замены значения.

Окончательная строка будет заменена значением '3F'

Строковое значение назначено переменной 'inputHex'.То же самое передается 'inputHexStr' для вызова шаблона replace95.В данной строке первое значение '95' встречается в позициях 134 и 135. поэтому вызывается условие not (string-length (substring-before ($ inputHexStr, $ from)) mod 2 = 0).Проблема в том, что ... при следующем вызове шаблона 'replace95' с оставшимся значением строки строка недоступна и отладка отображается как набор узлов.

Почему это?

Обновление - для входного xml как <x/> следующая итерация изменяет контекст на корневой узел данного xml-файла, и значение inputHexStr отображается как набор узлов вместо строки.

 <?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 Ответ

1 голос
/ 07 октября 2011

Я думаю, это из-за опечатки, когда вы рекурсивно вызываете свои шаблоны с параметрами.

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

Здесь у вас есть строчные буквы s .XSLT чувствителен к регистру, поэтому он должен быть заглавным S

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

Обратите внимание, что, возможно, стоит объединить ваши два xls: if оператора в один 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...