Логика для создания нескольких строк для комбинации BIOSRelDate и BIOSVersion - PullRequest
0 голосов
/ 20 марта 2019

Не могли бы вы посоветовать, как я могу построить логику XSLT, используя приведенный ниже XML? Мне нужно иметь возможность сортировать по BIOSReldate и создать две строки для комбинации BIOSReldate и BIOSVersion.

Мой окончательный вывод должен иметь следующие атрибуты в .CSV

Description, Class, HardwareID, Vendor, BIOSRelDate, BIOSVersion

<!---

Существует два экземпляра BIOSRelDate и BIOSVersion, которые необходимо сгенерировать в виде нескольких строк

 <Device Count="1" Description="xxxx System Management BIOS Driver"   
 Class="System" DeviceType="Smbios">
      <HardwareIDs>
        <ID Value="ROOT\mssmbios" />
      </HardwareIDs>
      <Properties>
        <Vendor Value="American Megatrends Inc." />
        <BIOSRelDate Value="11/02/2016" />
        <BIOSVersion Value="C1043.BS.4A16.AH1" />
        <BIOSRelDate Value="10/02/2017" />
        <BIOSVersion Value="C1043.BS.4A25.AH1" />
      </Properties>
</Device>

Below is what I tried -

<xsl:apply-templates select="Device/Properties">
    <xsl:sort select="BIOSRelDate" data-type="number" order="ascending"/>
</xsl:apply-templates>
...
<xsl:template match="BIOSRelDate">
    <!--Duplicate all Properties data for each BIOSRelDate-->
    <Device>
        <xsl:value-of select="../*[not(self::BIOSRelDate)] | ."/>
    </Device>
</xsl:template>

1 Ответ

0 голосов
/ 23 марта 2019

Попробуй так?

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/Device">
    <!-- HEADER -->
    <xsl:text>Description, Class, HardwareID, Vendor, BIOSRelDate, BIOSVersion&#10;</xsl:text>
    <!-- COMMON DATA -->
    <xsl:variable name="common">
        <xsl:value-of select="@Description"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="@Class"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="HardwareIDs/ID/@Value"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="Properties/Vendor/@Value"/>
        <xsl:text>,</xsl:text>
    </xsl:variable>
    <!-- GENERATE ROWS -->
    <xsl:for-each select="Properties/BIOSRelDate">
        <!-- SORT BY YEAR -->
        <xsl:sort select="substring(@Value, 7, 4)" data-type="number"/>
        <!-- SORT BY MONTH -->
        <xsl:sort select="substring(@Value, 1, 2)" data-type="number"/>
        <!-- SORT BY DAY -->
        <xsl:sort select="substring(@Value, 4, 2)" data-type="number"/>
        <!-- OUTPUT -->
        <xsl:value-of select="$common"/>        
        <xsl:value-of select="@Value"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="following-sibling::BIOSVersion[1]/@Value"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Применительно к вашему входному примеру результат будет:

Description, Class, HardwareID, Vendor, BIOSRelDate, BIOSVersion
xxxx System Management BIOS Driver,System,ROOT\\mssmbios,American Megatrends Inc.,11/02/2016,C1043.BS.4A16.AH1
xxxx System Management BIOS Driver,System,ROOT\\mssmbios,American Megatrends Inc.,10/02/2017,C1043.BS.4A25.AH1

Обратите внимание, что я предположил, что ваш формат даты MM/DD/YYYY. Ваш пример неоднозначен в этом отношении. Если это DD/MM/YYYY, сделайте необходимую настройку.

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