xml - 使用 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>
解决方案
您可以使用以下 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 中不存在这些值)。命名空间大多是正确的,但我想你毕竟必须调整它们。
推荐阅读
- swift - 挣扎于基本的 Swift 逻辑(使用常量、变量和循环)
- postgresql - go-pg - 读取 upsert 后返回的 ID
- firebase - 在 github 操作上运行 firebase 模拟器
- r - 在 R 中带有警告的函数中抑制、记录和返回值
- android - 如何从 android Recognizer Intent 获取实时数据?
- svelte - Svelte 如何根据数字推入具有不同 props 的组件
- r - 如何使用 SQLite 存储函数
- java - 如何在属性文件中维护 Gradle 构建的项目和依赖项 jar 版本?
- c# - 在 C# 中正确覆盖异步方法
- airflow - Airflow dag 卡在运行状态