Как xsl: function возвращает строковое значение, включая HTML-теги - PullRequest
2 голосов
/ 29 января 2012

Я пытаюсь транспонировать Java-функцию в спецификацию xsl: function.Функция в основном размещает HTML-теги вокруг подстрок.Теперь я сталкиваюсь с трудностями: с помощью встроенного кода Java это работает отлично, но я не могу понять, как предотвратить выходной выход при использовании функции xsl :.Как получить вывод, содержащий требуемые теги html?

Упрощенный пример того, чего я пытаюсь достичь, заключается в следующем: значение входного параметра «AB» должно приводить к строке A B , отображается в html-браузере как A B , конечно.

Пример функции, которую я попробовал, приведен ниже;но тогда полученная строка будет A <; b>; B <; / b>;(обратите внимание, что мне пришлось добавить пробелы, чтобы предотвратить интерпретацию сущностей в этом редакторе), что, конечно, отображается в браузерах как A B .

Обратите внимание, что xsl: element не может бытьиспользуется в коде xsl: function, потому что это не имеет никакого эффекта;Я хочу, чтобы строковый результат вызова функции содержал символы <и>, а затем добавил строковый результат в выходной файл результатов.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:custom="http://localhost:8080/customFunctions">

    <xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>

    <xsl:function name="custom:test">
        <xsl:param name="str"/> 

        <xsl:value-of select="substring($str,1,1)"/>
        <xsl:text disable-output-escaping="yes"><![CDATA[<b>]]></xsl:text>
        <xsl:value-of select="substring($str,2)"/>
        <xsl:text disable-output-escaping="yes"><![CDATA[</b>]]></xsl:text>
    </xsl:function>

    <xsl:template match="/">
        <xsl:element name="html">
            <xsl:element name="body">
                <xsl:value-of select="custom:test('AB')"/>
            </xsl:element>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

1 Ответ

6 голосов
/ 29 января 2012

Вот пример, используйте последовательность вместо value-of и убедитесь, что ваша функция возвращает узлы (что обычно просто делается путем записи буквальных элементов результата):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:custom="http://localhost:8080/customFunctions"
    exclude-result-prefixes="custom">

    <xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>

    <xsl:function name="custom:test">
        <xsl:param name="str"/> 

        <xsl:value-of select="substring($str,1,1)"/>
        <b>
          <xsl:value-of select="substring($str,2)"/>
        </b>
    </xsl:function>

    <xsl:template match="/">
        <xsl:element name="html">
            <xsl:element name="body">
                <xsl:sequence select="custom:test('AB')"/>
            </xsl:element>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>
...