Амперсанд "&" вызывает net .sf.saxon.s9api.SaxonApiException - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица стилей xslt для обработки некоторых XML данных, предоставленных устаревшей системой. XML Пример:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contract>
    <variable id="info">
        <variable id="client">
            <variable id="profession" value="0128"/>
            <variable id="missingInfo" value="null"/>
            <variable id="address">
                <variable id="town" value="MADRID"/>
                <variable id="street" value="CALLE SAN SEBASTIAN"/>
                <variable id="postalCode" value="50505-207"/>
            </variable>
            <variable id="taxId" value="123456789"/>
            <variable id="declineDetails" value="null"/>
        </variable>
        <variable id="height" value="null"/>
    </variable>
    <variable id="supplier">
        <variable id="phoneNumber" value="1020304050"/>
        <variable id="address">
            <variable id="town" value="BARCELONA"/>
            <variable id="street" value="AVINGUDA DIAGONAL 44"/>
            <variable id="postalCode" value="40780-575"/>
        </variable>
        <variable id="taxId" value="1020304050"/>
        <variable id="name" value="STICKS &amp; STONES"/>
        <variable id="birthDate" value="null"/>
        <variable id="email" value="sticksandstones@beemail.org"/>
    </variable> 
</contract>

Используемая таблица стилей XSL (упрощенная):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <result>
            <xsl:for-each select="/contract/variable[@id = 'info']/variable[@id = 'client' and variable[@id = 'taxId']/@value != ../variable[@id = 'supplier']/variable[@id = 'taxId']/@value]">
                <xsl:variable name="taxId" select="variable[@id = 'taxId']/@value"/>
                <contract>
                    <variable id="info">
                        <xsl:copy-of select="/contract/variable[@id = 'info']/variable[@id = 'client' and variable[@id = 'taxId']/@value = $taxId]"/>
                        <xsl:copy-of select="/contract/variable[@id = 'info']/variable[@id != 'client']"/>
                    </variable>
                    <xsl:copy-of select="/contract/variable[@id != 'info']"/>
                </contract>
            </xsl:for-each>
        </result>
    </xsl:template>
</xsl:stylesheet>

Когда применяется таблица стилей, возникает исключение:

Caused by: net.sf.saxon.trans.XPathException: No closing ';' found for entity or character reference

Пробовал обработать те же данные, заменив % ∓ на букву (допустим E ), все работает как положено. Пример:

<variable id="name" value="STICKS E STONES"/>

Я также пробовал использовать disable-output-escaping , но безуспешно, поскольку кажется, что он совместим только с xsl: value-of инструкции, а не xsl: copy-of инструкции.

Все преобразования без знака амперсанда работают должным образом.

Чего я пытаюсь достичь:

<variable id="name" value="STICKS &amp; STONES"/>

Как сохранить амперсанд в окончательном преобразованном xml?

1 Ответ

1 голос
/ 26 мая 2020

Вы не предоставили часть кода, которая вызывает ошибку.

В вашем коде есть странные вещи: он выполняет и /data/variable, и /contract/variable без изменения элемента контекста: безусловно, самый внешний элемент - это либо data, либо contract, вряд ли они оба. Кроме того, у вас есть xsl:for-each, который обрабатывает некоторый набор узлов, и действие, которое он выполняет, точно такое же, независимо от того, какой узел вы обрабатываете.

Итак, в вашем коде много неправильного, но ничего такого, что напрямую объясняет ошибку, о которой вы сообщаете.

Вы спрашиваете: « Как я могу сохранить амперсанд в окончательном преобразованном xml? », но на самом деле вы не говорите нам, какой у вас результат пытаюсь произвести.

...