Преобразование xml с помощью xsl для интеграции систем

Привет, я пытаюсь преобразовать этот xml в правильный формат с помощью xsl. Я новичок в xsl и у меня проблемы. Мне нужно импортировать xml в базу данных через приложение.

Мне не нужны все атрибуты из уведомления. Я пробовал тег for-each в xsl. Это перебирает элементы, но я хочу выбрать только пару из них, а затем добавить другие данные самостоятельно, например max: ponum, max: DOROLLOVER.

xml для преобразования:

<Notification>
    <item name="NotificationName" type="Standard">CRHWTL01 Run Hours</item>
    <item name="NotificationDescription" type="Standard">wind turbine location 01 run hours</item>
    <item name="NotificationState" type="Standard">Trend</item>
    <item name="StartTime" type="Standard">10/1/2014 4:35:00 PM</item>
    <item name="EndTime" type="Standard">1/1/1970 12:00:00 AM</item>
    <item name="TriggerTime" type="Standard">10/1/2014 5:05:00 PM</item>
    <item name="Priority" type="Standard">Low</item>
    <item name="Target" type="Standard">\\maximo\Turbines\Turbine1</item>
    <item name="State" type="Standard">Trend</item>
    <item name="NotificationInstanceID" type="Standard">1</item>
    <item name="NotificationUniqueID" type="Standard">e4472d26-5366-4e57-bc7c-1af3beb50949</item>
    <item name="\\Turbine1|Turbine OK Hours Status" 
    type="AFAttribute">19850</item>
</Notification>

Желаемый формат:

<?xml version="1.0" encoding="UTF-8"?>
<SyncMXMETERDATA xmlns:max="http://www.ibm.com/maximo" creationDateTime="2008-09-29T02:49:45" baseLanguage="string" transLanguage="string" messageID="string" maximoVersion="string">
    <MXMETERDATASet>
      <METERDATA action="Delete" relationship="string" ForInsert="string" transLanguage="string">
        <CHANGEDATE changed="false">2008-11-15T16:52:58</CHANGEDATE>
        <DOROLLOVER changed="true">false</max:DOROLLOVER>
        <INSPECTOR changed="true">string</INSPECTOR>
        <ISDELTA changed="false">true</ISDELTA>
        <MEASUREDATE changed="true">2018-02-04T14:35:59+00:00</MEASUREDATE>
        <MEASUREMENTID changed="true">10</MEASUREMENTID>
        <MEASUREMENTVALUE changed="false">1.051732E7</MEASUREMENTVALUE>
        <METERNAME changed="false">string</METERNAME>
        <POINTNUM changed="true">string</POINTNUM>
        <SITEID changed="false">string</SITEID>
      </METERDATA>
    </MXMETERDATASet>
</SyncMXMETERDATA>

XSL, который я написал

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="http://http://www>w>org/2001/XMLSchema xmlns:maximoMappings="local" exclude-
result_prefixes="xs">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <SyncMXMETERDATA xmlns:max="http://www.ibm.com/maximo" messageID="string">
        <MXMETERDATASet>
            <METERDATA>                        
                 <MEASUREMENTVALUE><xsl:value-of 
                 select="Notification[item/@name = 'Turbine1-Turbine OK Hours
                 Status']"/></MEASUREMENTVALUE>
                 <POINTNUM>GB1001</POINTNUM>
                 <DOROLLOVER changed="true">false</DOROLLOVER>
                 <ISDELTA changed="false">true</ISDELTA>
                 <MAXINTERRORMSG>string</MAXINTERRORMSG>
              </METERDATA>
          </MXMETERDATASet>
          </SyncMXMETERDATA>
    </xsl:template>
</xsl:stylesheet>

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


person Eoin    schedule 03.10.2014    source источник


Ответы (1)


В вашем текущем (обновленном) XSLT xsl:stylesheet содержит неработающую и незакрытую запись xmlns="http://http://www>w>org/2001/XMLSchema Кроме того, закрывающий тег </SyncMXMETERDATA> отсутствует.
Следующий XSLT производит (почти) желаемый вывод, за исключением <max:MEASUREMENTVALUE> и атрибута creationDateTime в качестве элемент с именем 'Turbine1-Turbine OK Hours Status' и значение creationDateTime не указаны во входном XML:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns="http://www.3.org/2001/XMLSchema"
  xmlns:maximoMappings="local"
  exclude-result-prefixes="xsl maximoMappings">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
   <max:SyncMXMETERDATA xmlns:max="http://www.ibm.com/maximo" 
    baseLanguage="string" transLanguage="string" messageID="string" 
    maximoVersion="string">
      <max:MXMETERDATASet>
        <max:METERDATA action="Delete" relationship="string" 
                       ForInsert="string" transLanguage="string">
          <max:POINTNUM>GB1001</max:POINTNUM>
            <max:DOROLLOVER changed="true">false</max:DOROLLOVER>
            <max:ISDELTA changed="false">true</max:ISDELTA>
            <max:MAXINTERRORMSG>string</max:MAXINTERRORMSG>                        
          </max:METERDATA>
      </max:MXMETERDATASet>
    </max:SyncMXMETERDATA>
</xsl:template>
</xsl:stylesheet>

Выходной XML:

<?xml version="1.0" encoding="UTF-8"?>
<max:SyncMXMETERDATA xmlns:max="http://www.ibm.com/maximo" 
     xmlns="http://www.3.org/2001/XMLSchema" baseLanguage="string"
     transLanguage="string" messageID="string" maximoVersion="string">
  <max:MXMETERDATASet>
     <max:METERDATA action="Delete" relationship="string" 
                    ForInsert="string" transLanguage="string">
       <max:POINTNUM>GB1001</max:POINTNUM>
       <max:DOROLLOVER changed="true">false</max:DOROLLOVER>
       <max:ISDELTA changed="false">true</max:ISDELTA>
       <max:MAXINTERRORMSG>string</max:MAXINTERRORMSG>
    </max:METERDATA>
  </max:MXMETERDATASet>
</max:SyncMXMETERDATA>

Еще одним отличием в выводе является атрибут xmlns="http://www.3.org/2001/XMLSchema" для <max:SyncMXMETERDATA>. Если вы не хотите, чтобы он выводился, вы можете удалить xmlns="http://www.3.org/2001/XMLSchema" из определения <xsl:stylesheet>.

person matthias_h    schedule 03.10.2014
comment
Спасибо за это, я не понял, что оставил макс в нужном формате. Я вернулся и изменил xsl, чтобы опустить максимум, но забыл вывод. Были некоторые основные ошибки, но мне потребовалось довольно много времени, чтобы добраться до этой точки. Еще раз спасибо matthias_h - person Eoin; 03.10.2014
comment
@Eoin, пожалуйста, примите ответ matthias_h, если он помог. Спасибо. - person kjhughes; 03.10.2014