L oop через список атрибутов в XML с XSLT - PullRequest
0 голосов
/ 27 января 2020

У меня следующая проблема:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Measurements>
    <StructurePath>200-2131</StructurePath>
    <MeasurementName>Visual</MeasurementName>
    <StatusName>Pass</StatusName>
    <P_DateTime>26/01/2020 13:08:51</P_DateTime>
  </Measurements>
  <Measurements>
    <StructurePath>200-2131</StructurePath>
    <MeasurementName>R iso</MeasurementName>
    <StatusName>Pass</StatusName>
    <P_DateTime>26.01.2020 13:08:56</P_DateTime>
    <R_Um>525 V</R_Um>
    <R_RISO_S_PAT>&gt;199.9 MOhm</R_RISO_S_PAT>
    <L_48_Limit_L_RISO_S_EE>2.00 MOhm</L_48_Limit_L_RISO_S_EE>
    <P_Instrument_ID>AOAB</P_Instrument_ID>
    <P_FW_ID>1.6.10</P_FW_ID>
    <P_Uiso_INST_EE>500 V</P_Uiso_INST_EE>
    <P_test_time_2>3 s</P_test_time_2>
    <P_Type_Riso_EE>Riso-S</P_Type_Riso_EE>
  </Measurements>
  <Measurements>
    <StructurePath>200-2131</StructurePath>
    <MeasurementName>Touch Leakage</MeasurementName>
    <StatusName>Pass</StatusName>
    <P_DateTime>26.01.2020 13:09:28</P_DateTime>
    <R_P>1.59 kW</R_P>
    <R_TouchLeakage_I>0.001 mA</R_TouchLeakage_I>
    <L_57_Limit_H_Touch_EE>0.50 mA</L_57_Limit_H_Touch_EE>
    <P_Instrument_ID>AOAB</P_Instrument_ID>
    <P_FW_ID>1.6.10</P_FW_ID>
    <P_test_time_2>10 s</P_test_time_2>
    <P_Leakage_change_status>YES</P_Leakage_change_status>
    <P_ChangeTime>5 s</P_ChangeTime>
  </Measurements>
  <Measurements>
    <StructurePath>200-2131</StructurePath>
    <MeasurementName>Functional</MeasurementName>
    <StatusName>Pass</StatusName>
    <P_DateTime>26/01/2020 13:09:43</P_DateTime>
  </Measurements>
</NewDataSet>

В этом наборе данных всегда присутствуют 4 значения: Structurepath MeasurementName StatusName P_DateTime

Я хочу, чтобы XSLT создал следующее:

<Data>
    <Object Type="_MetrelValues" Action="InsertOrSkip">
        <Property Name="Equipment" Value="200-2131"/>
        <Property Name="MeasurementPoint" Value="METRELMI3360"/>
        <Property Name="Date" Value="26/01/2020 13:08:51"/>
        <Property Name="Name" Value="Visual"/>
        <Property Name="MeasureStatus" Value="Pass"/>
        <Property Name="ConcatValues" Value="Values of the other attributes"/>
    </Object>
</Data>

Поскольку другие атрибуты являются полупостоянными, имена атрибутов не являются стандартными или одинаковыми для каждого измерения. Я хочу выбрать атрибуты, которые повторно создаются и объединить другие значения в 1 поле. Я просто не могу заставить его работать.

Это XSLT, который я создал до сих пор:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="*">
        <Data>
            <xsl:for-each select="Measurements">
                <Object Type="_MetrelValues" Action="InsertOrSkip">
                    <Property Name="Equipment" Value="{StructurePath}"/>
                    <Property Name="MeasurementPoint" Value="METRELMI3360"/>
                    <Property Name="Date" Value="{P_DateTime}"/>
                    <Property Name="Name" Value="{MeasurementName}"/>
                    <Property Name="MeasureStatus" Value="{StatusName}"/>
                    <Property Name="TestTime" Value="{P_test_time_2}"/>
                    <Property Name="ChangeTime" Value="{P_ChangeTime}"/>
                    <Property Name="Um" Value="{R_Um}"/>
                    <Property Name="RisoSPat" Value="{R_RISO_S_PAT}"/>
                    <Property Name="LimitRisoS" Value="{L_48_Limit_L_RISO_S_EE}"/>
                    <Property Name="InstEe" Value="{P_Uiso_INST_EE}"/>
                    <Property Name="EisoEE" Value="{P_Type_Riso_EE}"/>
                    <Property Name="RP" Value="{R_P}"/>
                    <Property Name="TouchLeakage" Value="{R_TouchLeakage_I}"/>
                    <Property Name="LimitTouch" Value="{L_57_Limit_H_Touch_EE}"/>
                </Object>
            </xsl:for-each>
        </Data>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

0 голосов
/ 27 января 2020

После преобразования в стиле pull эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/*">
        <Data>
            <xsl:for-each select="Measurements">
                <xsl:variable name="others"
                              select="*[not(self::StructurePath
                                            |self::P_DateTime
                                            |self::MeasurementName
                                            |self::StatusName)]"/>
                <Object Type="_MetrelValues" Action="InsertOrSkip">
                    <Property Name="Equipment" Value="{StructurePath}"/>
                    <Property Name="MeasurementPoint" Value="METRELMI3360"/>
                    <Property Name="Date" Value="{P_DateTime}"/>
                    <Property Name="Name" Value="{MeasurementName}"/>
                    <Property Name="MeasureStatus" Value="{StatusName}"/>
                    <xsl:if test="$others">
                        <Property Name="ConcatValues">
                            <xsl:attribute name="Value">
                                <xsl:for-each select="$others">
                                    <xsl:value-of select="."/>
                                    <xsl:if test="position()!=1">
                                        <xsl:value-of select="' '"/>
                                    </xsl:if>
                                </xsl:for-each>                           
                            </xsl:attribute>    
                        </Property>
                    </xsl:if>
                </Object>
            </xsl:for-each>
        </Data>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<Data>
   <Object Type="_MetrelValues" Action="InsertOrSkip">
      <Property Name="Equipment" Value="200-2131"/>
      <Property Name="MeasurementPoint" Value="METRELMI3360"/>
      <Property Name="Date" Value="26/01/2020 13:08:51"/>
      <Property Name="Name" Value="Visual"/>
      <Property Name="MeasureStatus" Value="Pass"/>
   </Object>
   <Object Type="_MetrelValues" Action="InsertOrSkip">
      <Property Name="Equipment" Value="200-2131"/>
      <Property Name="MeasurementPoint" Value="METRELMI3360"/>
      <Property Name="Date" Value="26.01.2020 13:08:56"/>
      <Property Name="Name" Value="R iso"/>
      <Property Name="MeasureStatus" Value="Pass"/>
      <Property Name="ConcatValues"
                Value="525 V&gt;199.9 MOhm 2.00 MOhm AOAB 1.6.10 500 V 3 s Riso-S "/>
   </Object>
   <Object Type="_MetrelValues" Action="InsertOrSkip">
      <Property Name="Equipment" Value="200-2131"/>
      <Property Name="MeasurementPoint" Value="METRELMI3360"/>
      <Property Name="Date" Value="26.01.2020 13:09:28"/>
      <Property Name="Name" Value="Touch Leakage"/>
      <Property Name="MeasureStatus" Value="Pass"/>
      <Property Name="ConcatValues"
                Value="1.59 kW0.001 mA 0.50 mA AOAB 1.6.10 10 s YES 5 s "/>
   </Object>
   <Object Type="_MetrelValues" Action="InsertOrSkip">
      <Property Name="Equipment" Value="200-2131"/>
      <Property Name="MeasurementPoint" Value="METRELMI3360"/>
      <Property Name="Date" Value="26/01/2020 13:09:43"/>
      <Property Name="Name" Value="Functional"/>
      <Property Name="MeasureStatus" Value="Pass"/>
   </Object>
</Data>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...