У меня есть вопрос, касающийся выхода в eXist-db 4.5:
Я использую transform:transform
(с $serialization-options
= method=text media-type=application/text
) и xmldb:store
(с $mime-type
= text/plain
) чтобы сохранить выходные данные преобразования XSL обратно в базу данных.Внутри моей таблицы стилей xslt я использую
<xsl:value-of select="concat('Tom ', '&', ' Peter')"/>
Но вывод, сохраненный обратно в eXist, выглядит как Tom $amp; Peter
вместо Tom & Peter
, как я ожидал.Когда я указываю disable-output-escaping="yes"
eXist завершается с ошибкой ...
<xsl:value-of select="concat('Tom ', '&', ' Peter')" disable-output-escaping="yes"/>
Использование transform:stream-transform
, как предложено здесь тоже не работает, потому что мне нужно сохранить вывод втекстовый файл.
Как я могу убедиться, что могу использовать concat
и специальные символы, такие как &
, в своем XSL-преобразовании?
Редактировать: Добавлен пример
Допустим, у вас есть коллекция eXist с именем temp
в /db/apps/
со следующими файлами:
input.xml
<?xml version="1.0" encoding="UTF-8"?>
<testxml>
<name>Peter</name>
</testxml>
stylesheet.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0">
<xsl:template match="/">
<!-- Ampersand is not encoded: --> <xsl:value-of select="concat('Tom ', '& ', testxml/name)"/> -->
<!-- transformation fails: <xsl:value-of disable-output-escaping="yes" select="concat('Tom ', '&', testxml/name)"/> -->
<!-- Doesn't work obviously: <xsl:value-of select="concat('Tom ', '&', testxml/name)"/> -->
</xsl:template>
</xsl:stylesheet>
И
transformation.xq
xquery version "3.1";
declare function local:xml2tex() as xs:string
{
let $mime-type := "text/plain"
let $stylesheet := doc("/db/apps/temp/stylesheet.xsl")
let $serializationoptions := "method=text media-type=application/text"
let $doc := doc("/db/apps/temp/input.xml")
let $filename := (replace(util:document-name($doc), "\.xml$", "") || ".tex")
let $transform := transform:transform(
$doc,
$stylesheet,
(),
(),
$serializationoptions)
let $store := xmldb:store("/db/apps/temp", $filename, $transform, $mime-type)
return
$filename
};
local:xml2tex()
Когда вы оцениваете transformation.xq
с тремя содержащимися опциями value-of select
, вы видите, что рабочий из них выдает *.tex
файл с содержанием Tom & Peter
, которое не , что предполагается (это будет Tom & Peter
)