Рекурсивный вызов функции, выдающей ошибку в XSLT - PullRequest
0 голосов
/ 02 октября 2019

Я пишу функцию, чтобы разбить строку, не разбивая слова. Для этого у меня есть функция возврата, которая делает рекурсивный вызов сам по себе. Это дает мне ошибку ниже

  1. Когда я вызываю функцию с префиксом функции, то получаю ошибку, поскольку «функция splitLine в пространстве имен http://whatever не определена».
  2. Когда я вызываю функцию без префикса функции, то получаю ошибку Parse в функции.

Когда я пытаюсь использовать

<xsl:value-of select="fn:splitLine($inString,$length - 1)"/>

в другом состоянии функцииполучить функцию не определена ошибка.

Когда я пытаюсь использовать без префикса функции:

<xsl:value-of select="fn:splitLine($inString,$length - 1)"/>

Я получаю ошибку разбора в функции.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://whatever">
  <xsl:output omit-xml-declaration="no" /> 
  <xsl:output method="xml" /> 
<xsl:function name="fn:splitLine" as="xs:string">
        <xsl:param name="inString" as="xs:string"/>
        <xsl:param name="length" as="xs:numeric"/>
        <xsl:variable name="delimiters"> ,."!?()</xsl:variable>
        <xsl:choose>
            <xsl:when test="0.0 >= $length ">
                <xsl:value-of select="$inString"/>
            </xsl:when>
            <xsl:when test="$length >= string-length($inString)">
                <xsl:value-of select="$inString"/>
            </xsl:when>
            <xsl:when test="contains($delimiters,substring($inString,$length + 1,1))">
                <xsl:value-of select="substring($inString,1,$length)"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="fn:splitLine($inString,$length - 1)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:function>
<xsl:template match="/">
<xsl:value-of select="fn:splitLine('3 ZHANLANGUAN RD XICHENG, , , BEIJING, , CN, ',35)"/>
  </xsl:template>
</xsl:stylesheet>

Я ожидаю выводабыть "3 ZHANLANGUAN RD XICHENG,,,", не нарушая слова.

Ответы [ 3 ]

0 голосов
/ 03 октября 2019

Ниже приведен результат для процессора и версии: Процессор: Oracle Corporation. : Версия: 2 -

Справа. Oracle (до того, как они приобрели Sun) прошли долгий путь к разработке процессора XSLT 2.0 в составе Oracle XDK (комплект разработки XML). Но они так и не закончили его, и он никогда не достиг высокого уровня соответствия спецификации.

Мне кажется, что вы столкнулись с ограничением в этом процессоре - и я уверен, что есть много других,Я не думаю, что многие люди используют Oracle XDK в наши дни, и я думаю, что с тех пор, как Oracle приобрела Sun (и, следовательно, Java), она развивалась очень мало.

0 голосов
/ 05 октября 2019

@ Тим Спасибо за предложение. Вместо использования функции я использовал именованный шаблон, и он отлично работал:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://whatever">
  <xsl:output omit-xml-declaration="no" /> 
  <xsl:output method="xml" />
  <xsl:template name="splitLine">
    <xsl:param name="inString"/>
    <xsl:param name="length"/>
    <xsl:variable name="delimiters"> ,."!?()</xsl:variable>
    <xsl:choose>
        <xsl:when test="0.0 >= $length ">
            <xsl:value-of select="$inString"/>
        </xsl:when>
        <xsl:when test="$length >= string-length($inString)">
            <xsl:value-of select="$inString"/>
        </xsl:when>
        <xsl:when test="contains($delimiters,substring($inString,$length + 1,1))">
            <xsl:value-of select="substring($inString,1,$length)"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:call-template name="splitLine">
                <xsl:with-param name="inString" select="$inString" />
                <xsl:with-param name="length" select="$length - 1" />
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="/">
    <xsl:call-template name="splitLine">
        <xsl:with-param name="inString" select="'fullnameofsample supplier in the block" />
        <xsl:with-param name="length" select="35" />
    </xsl:call-template>
</xsl:template>
</xsl:stylesheet>
0 голосов
/ 02 октября 2019

Это должно быть причуда вашего XSLT-процессора.
Я проверил ваш файл XSLT-2.0 с Saxon-HE 9.9.1.4J, и он работает, как и ожидалось, после добавления следующего пространства имен к элементу xsl:stylesheet:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

Итак, я думаю, что ваш XSLT-процессор вернул другое пространство имен как отсутствующее, потому что после добавления вышеупомянутого все команды могут быть обработаны, и результат будет таким, как ожидалось.

...