首页 > 解决方案 > 使用 XSL 将 XML 从 Get 转换为 AddChange

问题描述

我正在尝试使用 XSL 转换 XML,但我不知道它出了什么问题。目标 XML 中的字段名称不同,结构也略有不同。另外..如果我发出获取请求并且收到下面的 xml,是否可以使用 AddChange 操作将其转换为 xml?

<?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>

标签: xmlxslt

解决方案


您可以使用以下 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 中不存在这些值)。命名空间大多是正确的,但我想你毕竟必须调整它们。


推荐阅读