Как устранить xmlns = “” записи, произведенные XSLT, преобразовывают одного документа XML другому документу XML

Я полагаю, что хвостовая рекурсия в Java в настоящее время не оптимизируется. Детали опрыснуты повсюду этот обсуждение LtU и связанных ссылок. Это может быть функцией в следующей версии 7, но по-видимому это представляет определенные трудности, когда объединено с Контролем Стека, так как определенные кадры отсутствовали бы. Контроль стека использовался для реализации их мелкомодульной модели обеспечения безопасности начиная с Java 2.

http://lambda-the-ultimate.org/node/1333

13
задан pnuts 16 November 2015 в 23:10
поделиться

3 ответа

Используйте префиксы exclude-result в теге xsl: stylesheet с префиксом "#default"

Ссылка в w3c на это ЗДЕСЬ

РЕДАКТИРОВАТЬ: ОК, Мне следовало более внимательно изучить ваш XSL. Переместите xmlns в теге сообщения вверх в тег таблицы стилей. Это поместит ВСЕ элементы результата в одно и то же пространство имен и приведет к одному атрибуту пространства имен в теге сообщения. Я запустил это в Oxygen / XML и получил желаемый результат.

9
ответ дан 2 December 2019 в 01:31
поделиться

Хорошо, я понял.

XSLT, который мне нужен, выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:fn="http://www.w3.org/2005/xpath-functions"
                exclude-result-prefixes="xsl fo xs fn">

    <xsl:output method="xml" version="1.0" indent="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates select="message"/>
    </xsl:template>

    <xsl:template match="message">
        <message namespace="http://www.companyname.com/schemas/product/Version001">
            <xsl:apply-templates select="/message/cmd/@id"/>
        </message>
    </xsl:template>

    <xsl:template match="/message/cmd/@id">
        <xsl:variable name="_commandType" select="/message/cmd/@id"/>

        <xsl:element name="messageHeader">
            <xsl:element name="cmdType">
                <xsl:value-of select="$_commandType"/>
            </xsl:element>
        </xsl:element>

        <xsl:element name="messageBody">
            <xsl:choose>
                <xsl:when test="$_commandType = 'api_info'">
                    <xsl:element name="apiInfoBody">
                        <xsl:element name="apiVersion">
                            <xsl:value-of select="/message/cmd/api-version"/>
                        </xsl:element>
                        <xsl:element name="apiBuild">
                            <xsl:value-of select="/message/cmd/api-build"/>
                        </xsl:element>
                    </xsl:element>
                </xsl:when>
                <xsl:when test="$_commandType = 'communicationError'">
                    <xsl:element name="communicationErrorBody">
                        <xsl:element name="errorCode">
                            <xsl:value-of select="error-code"/>
                        </xsl:element>
                        <xsl:element name="badCmd">
                            <xsl:value-of select="bad-cmd"/>
                        </xsl:element>
                    </xsl:element>
                </xsl:when>
            </xsl:choose>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Исправленное изменение заключалось в добавлении префиксов исключенных результатов к элементу и изменить раздел, который был:

    <xsl:template match="message">
        <xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001">
            <xsl:apply-templates select="/message/cmd/@id"/>
        </xsl:element>
    </xsl:template>

, на следующий:

    <xsl:template match="message">
        <message namespace="http://www.companyname.com/schemas/product/Version001">
            <xsl:apply-templates select="/message/cmd/@id"/>
        </message>
    </xsl:template>

И теперь я снова счастлив.

Возможно, есть лучше способы сделать это, но это работает для меня. Любые будущие предложения по-прежнему приветствуются.

0
ответ дан 2 December 2019 в 01:31
поделиться

Ответ Джима Гаррисона (обновленный) - это все, что вам должно было понадобиться. Но опубликованная вами обновленная таблица стилей выводит в результате атрибут «пространство имен», поэтому я не уверен, что это дает вам.

Ключевой момент, который нужно понять, - это то, как работает пространство имен по умолчанию. Не думайте о xmlns как об атрибуте, который вы можете вывести в результат. Вместо этого думайте об этом как о лексической детали вашей таблицы стилей, цель которой - установить пространство имен по умолчанию для всего, что находится под ним (самого элемента и каждого из его потомков, пока оно не будет отменено). (В свою очередь, он выполняет ту же функцию в результирующем XML, который имеет совершенно другую структуру, чем сама таблица стилей.)

Литеральные элементы результата в вашей таблице стилей (например, ), а также инструкции (например,

0
ответ дан 2 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: