Отвечая на этот вопрос, я понял, что знаю, как использовать XSLT 3.0 (XPath 3.0) serialize()
, но я не знаю, как избежать сериализации пространств имен которые находятся в сфере действия. Вот минимальный пример:
Ввод XML
<?xml version="1.0" encoding="UTF-8" ?>
<ci:cichlids xmlns:ci="http://www.cichlids.com">
<cichlid id="1">
<name>Zeus</name>
<color>gold</color>
<teeth>molariform</teeth>
<breeding-type>lekking</breeding-type>
</cichlid>
</ci:cichlids>
Таблица стилей XSLT 3.0
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization"
xmlns:ci="http://www.cichlids.com">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/ci:cichlids/cichlid">
<xsl:variable name="serial-params">
<output:serialization-parameters>
<output:omit-xml-declaration value="yes"/>
</output:serialization-parameters>
</xsl:variable>
<xsl:value-of select="serialize(., $serial-params/*)"/>
</xsl:template>
</xsl:stylesheet>
Фактический результат
<?xml version="1.0" encoding="UTF-8"?>
<ci:cichlids xmlns:ci="http://www.cichlids.com">
<cichlid xmlns:ci="http://www.cichlids.com" id="1">
<name>Zeus</name>
<color>gold</color>
<teeth>molariform</teeth>
<breeding-type>lekking</breeding-type>
</cichlid>
</ci:cichlids>
Процесс сериализации включал объявление пространства имен, которое находится в области действия для элемента cichlid
, хотя оно не используется в этом элементе. Я хотел бы удалить это объявление и сделать вывод похожим на
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8"?>
<ci:cichlids xmlns:ci="http://www.cichlids.com">
<cichlid id="1">
<name>Zeus</name>
<color>gold</color>
<teeth>molariform</teeth>
<breeding-type>lekking</breeding-type>
</cichlid>
</ci:cichlids>
Я знаю, как изменить элемент cichlid
, удалив пространства имен в области видимости, и вместо этого сериализовать этот измененный элемент. Но это кажется довольно громоздким решением. Мой вопрос:
Каков канонический способ сериализации элемента XML с помощью serialize()
без сериализации неиспользуемых объявлений пространств имен, находящихся в области видимости?
Тестирование с Saxon-EE 9.6.0.7 из Oxygen.