Требуется XSLT для преобразования значений атрибута xml в формат CSV (в CDATA) в другой формат XML - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно преобразование XSLT для преобразования одного формата XML, который содержит значения данных в атрибутах, в другой XML, имеющий те же значения данных, но в формате CSV, как текст в «CDATA».

Когда входной XML: -

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE labels SYSTEM "label.dtd">
<labels _FORMAT="c:\labels\format\VSAT_RCV_INV_LABEL.btw" _QUANTITY="1" _PRINTERNAME="STOUT" _JOBNAME="LBL1273712">
<label>
    <variable name= "current_date">18-OCT-2018</variable>
    <variable name= "item">1044103</variable>
    <variable name= "item_description">TERM,RING,22-16 AWG,#4,INSL,RED,PB FREE</variable>
    <variable name= "locator">INRE</variable>
    <variable name= "mfg_part_num"></variable>
</label>
</labels>

Выходной XML должен быть: -

<xml version="1.0"?>
<XMLScript Version="1.0">
<Command>
    <Print JobName="LBL1273712">
        <PrintSetup>
            <IdenticalCopiesOfLabel>1</IdenticalCopiesOfLabel>
            <Printer>STOUT</Printer>
        </PrintSetup>
        <Format>c:\labels\format\vsat_rcv_inv_label.btw</Format>
        <RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
            <Delimitation>btDelimMixedQuoteAndComma</Delimitation>
            <UseFieldNamesFromFirstRecord>true</UseFieldNamesFromFirstRecord>
            <TextData>
                <![CDATA[
"current_date","item","item_description","locator","mfg_part_num"
"18-OCT-2018", "1044103", "TERM,RING,22-16 AWG,#4,INSL,RED,PB FREE", "INRE", ""
]]>
            </TextData>
        </RecordSet>
    </Print>
</Command>
</XMLScript>

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

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

  • item,
  • locator,
  • current_date,
  • mfg_part_num,
  • item_description '

Но мне нужно поддерживать один определенный порядок в выходном XML, например

  • current_date,
  • item,
  • item_description,
  • locator,
  • mfg_part_num '

Как мне добиться этого с помощью XSLT?

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете использовать следующую таблицу стилей XSLT-1.0 для преобразования вашего входного XML в желаемый выходной XML:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" cdata-section-elements="TextData"/>

  <xsl:template match="/labels">
    <XMLScript Version="1.0">
        <Command>
            <Print JobName="{@_JOBNAME}">
                <PrintSetup>
                    <IdenticalCopiesOfLabel><xsl:value-of select="@_QUANTITY" /></IdenticalCopiesOfLabel>
                    <Printer><xsl:value-of select="@_PRINTERNAME" /></Printer>
                </PrintSetup>
                <Format><xsl:value-of select="@_FORMAT" /></Format>
                <xsl:for-each select="label">
                    <RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
                        <Delimitation>btDelimMixedQuoteAndComma</Delimitation>
                        <UseFieldNamesFromFirstRecord>true</UseFieldNamesFromFirstRecord>
                        <TextData>
                            <xsl:value-of select="concat('&quot;','current_date','&quot;, &quot;','item','&quot;, &quot;','item_description','&quot;, &quot;','locator','&quot;, &quot;','mfg_part_num','&quot;&#xa;')" />
                            <xsl:value-of select="concat('&quot;',
                            variable[@name='current_date'],'&quot;, &quot;',
                            variable[@name='item'],'&quot;, &quot;',
                            variable[@name='item_description'],'&quot;, &quot;',
                            variable[@name='locator'],'&quot;, &quot;',
                            variable[@name='mfg_part_num'],'&quot;'
                            )" />
                        </TextData>
                    </RecordSet>
                </xsl:for-each>
            </Print>
        </Command>
    </XMLScript>
  </xsl:template>

</xsl:stylesheet>

Секция CDATA TextData реализована с cdata-section-elements на xsl:outputэлемент.Остальное было просто копирование определенных элементов и атрибутов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...