Преобразуйте XML с XSL из Get в AddChange - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь преобразовать XML с помощью XSL, но я не знаю, что это не так. Поля в месте назначения XML названы по-разному, и структура также немного отличается. Кроме того ... Если я сделаю запрос на получение и получу xml ниже, его можно преобразовать в xml с действием AddChange?

<?xml version="1.0" encoding="UTF-8"?>
<RegisterSearch TotalResults="149">
<SearchResults>
  <Document DocumentId="xxxxxxxxxxxxx">
     <DocumentNumber>yyyyyyyyyyyyyyyy</DocumentNumber>
     <Title>Test Title</Title>
  </Document>
</SearchResults>
</RegisterSearch>

Мой XSL-файл:

<?xml version="1.0"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XMLSchema-instance">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
 <xsl:apply-templates select="SearchResults"/>
</xsl:template> 
<xsl:template match="SearchResults">
 <xsl:apply-templates select="Document"/>
</xsl:template> 


<xsl:template match="Document">

        <Ext_DB_STG class="R"> 

            <xsl:apply-templates select="mro:SITEID"/>
            <xsl:apply-templates select="mro:TASKID"/>
            <xsl:apply-templates select="mro:WONUM"/>

        </Ext_DB_STG>

 </xsl:template> 
 <!-- <xsl:template match="WORKORDER.> --> 

<xsl:template match="mro:SITEID">
 <DocumentId><xsl:value-of select="."/></DocumentId>
 </xsl:template> 


<xsl:template match="mro:TASKID">
 <DocumentNumber><xsl:value-of select="."/></DocumentNumber>
 </xsl:template> 


<xsl:template match="mro:WONUM">
     <Title><xsl:value-of select="."/></Title>
    </xsl:template> 

    </xsl:stylesheet> 

Что я делаю не так?

Результат XML Я хочу быть таким:

<?xml version="1.0" encoding="UTF-8"?>
<MXITEMIN xmlns="http://www.mro.com/mx/integration" language="EN">
    <Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     operation="Notify" event="1">
        <SenderID type="MAXIMO" majorversion="6" minorversion="0" build="02" dbbuild="V600-76">EXTSYS1</SenderID>
        <CreationDateTime>2005-08-15T14:28:06-05:00</CreationDateTime>
        <RecipientID>MX</RecipientID>
        <MessageID>11241304878859947</MessageID>
    </Header>
    <Content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <MXITEM>
            <ITEM action="AddChange">
                <SITEID>001TEST</SITEID>
                <TASKID>test item</TASKID>
                <WONUM>1</WONUM>

            </ITEM>
        </MXITEM>
    </Content>
</MXITEMIN>

1 Ответ

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

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

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mro="http://www.mro.com/mx/integration">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <xsl:element name="MXITEMIN" namespace="http://www.mro.com/mx/integration">
            <xsl:attribute name="language">EN</xsl:attribute>
            <xsl:apply-templates select="RegisterSearch/SearchResults"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="SearchResults">
        <xsl:element name="Header" namespace="http://www.mro.com/mx/integration">
            <xsl:attribute name="operation">Notify</xsl:attribute>
            <xsl:attribute name="event">1</xsl:attribute>
            <xsl:element name="SenderID" namespace="http://www.mro.com/mx/integration">
                <xsl:attribute name="type">MAXIMO</xsl:attribute>
                <xsl:attribute name="majorversion">6</xsl:attribute>
                <xsl:attribute name="minorversion">0</xsl:attribute>
                <xsl:attribute name="build">02</xsl:attribute>
                <xsl:attribute name="dbbuild">V600-76</xsl:attribute>
            </xsl:element>
            <xsl:element name="CreationDateTime" namespace="http://www.mro.com/mx/integration">2005-08-15T14:28:06-05:00</xsl:element>
            <xsl:element name="RecipientID" namespace="http://www.mro.com/mx/integration">MX</xsl:element>
            <xsl:element name="MessageID" namespace="http://www.mro.com/mx/integration">11241304878859947</xsl:element>
        </xsl:element>
        <xsl:apply-templates select="Document"/>
    </xsl:template>

    <xsl:template match="Document">
        <Content xmlns="http://www.mro.com/mx/integration">
            <MXITEM>
                <ITEM action="AddChange">
                    <SITEID><xsl:value-of select="..."/></SITEID>
                    <TASKID><xsl:value-of select="..."/></TASKID>
                    <WONUM><xsl:value-of select="..."/></WONUM>
                </ITEM>
            </MXITEM>
        </Content>
    </xsl:template>   

</xsl:stylesheet>

Его вывод:

<?xml version="1.0" encoding="UTF-8"?>
<MXITEMIN xmlns="http://www.mro.com/mx/integration" language="EN">
  <Header operation="Notify" event="1">
    <SenderID type="MAXIMO" majorversion="6" minorversion="0" build="02" dbbuild="V600-76"/>
    <CreationDateTime>2005-08-15T14:28:06-05:00</CreationDateTime>
    <RecipientID>MX</RecipientID>
    <MessageID>11241304878859947</MessageID>
  </Header>
  <Content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mro="http://www.mro.com/mx/integration">
    <MXITEM>
      <ITEM action="AddChange">
        <SITEID/>
        <TASKID/>
        <WONUM/>
      </ITEM>
    </MXITEM>
  </Content>
</MXITEMIN>

Так что вам нужно настроить выражения xsl:value-of "..." для выбора нужных значений (которых нет во входных данных XML). Пространства имен в основном правильные, но я думаю, что вам все-таки нужно их настроить.

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