Требуется XSLT для преобразования XML с переменными значениями атрибута в XML с CDATA - PullRequest
0 голосов
/ 24 октября 2018

Мне нужно преобразование xslt, которое преобразует xml, сгенерированный одним приложением и отправленный в другое приложение для обработки.Ниже приведен пример исходного XML-файла, содержащего имена полей данных и соответствующие им данные, такие как 'current_date', 'item' .. для имен полей и '18 -OCT-2018 ',' 1044103 ', .. для значений данных.

    <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
    <labels _JOBNAME="LBL1273711">
      <label>
        <variable name= "current_date">18-OCT-2018</variable>
        <variable name= "item">1044103</variable>
        <variable name= "item_description">RING,22-16 AWG,#4,RED,PB FREE</variable>
        <variable name= "locator">INRE</variable>
      </label>
    </labels>

Приведенный выше xml преобразуется в следующий xml:

    <XMLScript Version="1.0">
    <Command>
        <Print JobName="LBL1273711">
            <RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
            <TextData><![CDATA[
    current_date", "item", "item_description", "locator"
    "18-OCT-2018", "1044103", "RING,22-16 AWG,#4,RED,PB FREE", "INRE"
                ]]></TextData>
            </RecordSet>
        </Print>
    </Command>
</XMLScript>

Имена полей данных, количество полей и их значения будут различаться и изменяться от одного входящего xml к другому.используя приведенный ниже xslt в одном требовании, где имена полей и количество полей жестко закодированы.Но мне нужно изменить его, чтобы преобразовать исходный 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}">
            <RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
                <TextData>
                    <xsl:value-of select="concat('&#xa;'
                        ,'current_date','&quot;, &quot;','item','&quot;, &quot;',
                        'item_description','&quot;, &quot;','locator','&quot;&#xa;')" />
                    <xsl:for-each select="label">
                        <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;&#xa;'
                        )" />
            </xsl:for-each>
                    </TextData>
                </RecordSet>
        </Print>
    </Command>
    </XMLScript>
    </xsl:template>
</xsl:stylesheet>

Заранее спасибо.

1 Ответ

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

Если вы можете предположить, что для данного XML каждый label будет иметь одинаковые элементы variable под ним, вы можете сделать это для вывода заголовка ....

<xsl:for-each select="label[1]/variable">
   <xsl:if test="position() > 1">,</xsl:if>
  <xsl:value-of select="concat('&quot;', @name, '&quot;')" />
</xsl:for-each>

Ианалогично, для каждой метки, сделайте это для вывода значений

<xsl:for-each select="variable">
  <xsl:if test="position() > 1">,</xsl:if>
  <xsl:value-of select="concat('&quot;', ., '&quot;')" />
</xsl:for-each>

Попробуйте это XSLT

<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}">
      <RecordSet Name="Text File 1" Type="btTextFile" AddIfNone="true">
        <TextData>
          <xsl:for-each select="label[1]/variable">
            <xsl:if test="position() > 1">,</xsl:if>
            <xsl:value-of select="concat('&quot;', @name, '&quot;')" />
          </xsl:for-each>
          <xsl:text>&#10;</xsl:text>
          <xsl:for-each select="label">
            <xsl:for-each select="variable">
              <xsl:if test="position() > 1">,</xsl:if>
              <xsl:value-of select="concat('&quot;', ., '&quot;')" />
            </xsl:for-each>
            <xsl:text>&#10;</xsl:text>
          </xsl:for-each>
        </TextData>
      </RecordSet>
    </Print>
  </Command>
</XMLScript>
</xsl:template>
</xsl:stylesheet>

Обратите внимание: если вы можете использовать XSLT 2.0, вы можете заменить xsl:for-each наболее простые xsl:value-of заявления ...

<TextData>
  <xsl:value-of select="label[1]/variable/concat('&quot;', @name, '&quot;')" separator="," />
  <xsl:text>&#10;</xsl:text>
  <xsl:for-each select="label">
    <xsl:value-of select="variable/concat('&quot;', ., '&quot;')" separator="," />
    <xsl:text>&#10;</xsl:text>
  </xsl:for-each>
</TextData>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...