Перезаписать файлы с помощью XSLT - PullRequest
0 голосов
/ 06 июня 2019

Как можно перезаписать существующий (XML) файл с помощью XSLT? В настоящее время, используя <xsl:result-document/>, я получаю следующую ОШИБКУ

Невозможно записать в URI, который уже был прочитан

Я нашел совет , чтобы удалить файл раньше, но они не объясняют как. Интересно, должно ли быть более простое решение, чтобы сделать это.

Вот пример кода. Я использую Saxon 9.8.0.12 в редакторе Oxygen XML 20.1

<xsl:variable name="process">
    <xsl:apply-templates mode="process" select="doc($processedFile)"/>
</xsl:variable>

    <xsl:template match="/">        
        <xsl:result-document href="{$processedFile}" indent="yes" method="xml">
            <xsl:copy-of select="$process"/>
        </xsl:result-document>
    </xsl:template>

1 Ответ

2 голосов
/ 06 июня 2019

Это правило в спецификации XSLT, которое нельзя прочитать с URI, а затем записать в тот же URI в рамках одного и того же преобразования.Причина этого правила заключается в том, что порядок операций в XSLT не определен;оптимизатор может изменить порядок вещей, чтобы чтение происходило после записи.(В Saxon-EE xsl:result-document использует отдельный поток, так что это не пустая угроза: вещи часто происходят в порядке, отличном от того, что вы наивно ожидаете.)

Вы можете обойти правило,на свой страх и риск, используя тривиально другой URI, который ссылается на один и тот же базовый ресурс;например, добавьте лишний шаг /./ к пути или часть запроса ?dummy=yes.

. Конечно, помните, что если ваше преобразование завершится неудачно, вы уничтожили ввод.

...