Необходимо изменить формат кодирования на основе одного из тегов XML - PullRequest
0 голосов
/ 24 октября 2019

Я использую таблицу стилей XSL и XML для генерации текстового вывода. Мне нужно передать одно из значений тега XML в формат кодирования, но не смог найти синтаксис. Не могли бы вы помочь?

Я пытался сохранить XML в переменной, как показано в моем коде, но он не работает

Таблица стилей XSL:

<?xml version="1.0" ?>
<xsl:stylesheet version="2.0" extension-element-prefixes="exsl"> 
<xsl:variable name="encoding1" select="NAME/ENCODING"/>
<xsl:output method="text" encoding="encoding1" omit-xml-declaration="yes" indent="no"/>

Данные XML:

 <NAME>
  <ENCODING>us-ascii</ENCODING>
  <PRESCRIPTION>200</PRESCRIPTION>
 </NAME>

Ожидается: TXT-файл с форматом кодирования в соответствии с ANSI Фактический: невозможно объединить XML и таблицу стилей

1 Ответ

1 голос
/ 24 октября 2019

Элемент xsl:output не поддерживает xsl:variable в качестве входных данных для атрибута encoding. Но вы можете использовать элемент XSLT-2.0 xsl:result-document с шаблонами атрибута-значения, чтобы обойти это:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:variable name="encoding1" select="/NAME/ENCODING"/>
<xsl:variable name="inputFileName"  select="'input.xml'"/>
<xsl:variable name="outputFileName" select="'result.xml'"/>

    <!-- Identity template for 'input' -->
    <xsl:template match="@*|node()" mode="input">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" mode="input" />
        </xsl:copy>
    </xsl:template> 

    <!-- Create the result document with the desired encoding - here the input XML is copied -->
    <xsl:template match="/">
        <xsl:message terminate="no">Encoding is: <xsl:value-of select="$encoding1" /></xsl:message>
        <xsl:result-document encoding="{$encoding1}" href="{$outputFileName}">
            <xsl:apply-templates select="document($inputFileName)" mode="input" />
        </xsl:result-document>    
    </xsl:template> 

</xsl:stylesheet>

Здесь входной документ input.xml копируется с новой кодировкой, указанной в документе XMLпередается в качестве параметра (который содержит /NAME/ENCODING) процессору XSLT.

...