任何人都可以帮我这个吗?我尝试使用xsl映射转换MAXIMO企业服务的响应,并且我已成功转换它,但问题是,当我提交请求时它不会返回任何数据。
这是我的xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<SyncX1POMATREC>
<X1POMATRECSet>
<PO>
<SITEID>
<xsl:value-of select="string($var1_resultof_first/*[local-name()='SITEID' and namespace-uri()=''])"/>
</SITEID>
<PONUM>
<xsl:value-of select="PONUM"/>
</PONUM>
<REVISIONNUM>
<xsl:value-of select="REVISIONNUM"/>
</REVISIONNUM>
<POID>
<xsl:value-of select="POID"/>
</POID>
<RECEIPT>
<POLINENUM>
<xsl:value-of select="POLINENUM"/>
</POLINENUM>
<ITEMNUM>
<xsl:value-of select="ITEMNUM"/>
</ITEMNUM>
</RECEIPT>
</PO>
</X1POMATRECSet>
</SyncX1POMATREC>
</xsl:template>
以下是回复:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<SyncX1POMATREC xmlns:xs="http://www.w3.org/2001/XMLSchema">
<X1POMATRECSet>
<PO>
<SITEID/>
<PONUM/>
<REVISIONNUM/>
<POID/>
<RECEIPT>
<POLINENUM/>
<ITEMNUM/>
</RECEIPT>
</PO>
</X1POMATRECSet>
</SyncX1POMATREC>
</soapenv:Body>
</soapenv:Envelope>
EDITED
这是来自SOAP的请求XML:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:max="http://www.ibm.com/maximo">
<soapenv:Header/>
<soapenv:Body>
<max:SyncX1POMATREC>
<max:X1POMATRECSet>
<max:PO action="AddChange">
<max:SITEID>BEDFORD</max:SITEID>
<max:PONUM>TEST42</max:PONUM>
<max:REVISIONNUM>0</max:REVISIONNUM>
</max:PO>
</max:X1POMATRECSet>
</max:SyncX1POMATREC>
</soapenv:Body>
</soapenv:Envelope>
答案 0 :(得分:1)
输入XML具有以下名称空间xmlns:max="http://www.ibm.com/maximo"
和xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
,这些名称空间未在XSLT中声明。您需要在XSLT中声明这些名称空间以访问关联的XML元素。
在XSLT中,需要使用为命名空间声明的前缀来访问元素,在这种情况下,它将是max
,即max:SITEID
或max:PONUM
,依此类推。
以下是修改后的XSLT。某些元素即。输入XML共享中不存在POID
,POLINENUM
和ITEMNUM
,因此输出中不会显示任何值。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:max="http://www.ibm.com/maximo" exclude-result-prefixes="soapenv max">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="max:PO">
<SyncX1POMATREC>
<X1POMATRECSet>
<PO>
<SITEID><xsl:value-of select="max:SITEID" /></SITEID>
<PONUM><xsl:value-of select="max:PONUM" /></PONUM>
<REVISIONNUM><xsl:value-of select="max:REVISIONNUM" /></REVISIONNUM>
<POID><xsl:value-of select="POID" /></POID>
<RECEIPT>
<POLINENUM><xsl:value-of select="POLINENUM" /></POLINENUM>
<ITEMNUM><xsl:value-of select="ITEMNUM" /></ITEMNUM>
</RECEIPT>
</PO>
</X1POMATRECSet>
</SyncX1POMATREC>
</xsl:template>
</xsl:stylesheet>
输出
<SyncX1POMATREC>
<X1POMATRECSet>
<PO>
<SITEID>BEDFORD</SITEID>
<PONUM>TEST42</PONUM>
<REVISIONNUM>0</REVISIONNUM>
<POID />
<RECEIPT>
<POLINENUM />
<ITEMNUM />
</RECEIPT>
</PO>
</X1POMATRECSet>
</SyncX1POMATREC>
答案 1 :(得分:1)
另一种选择是使用class GetXyzResponseBean {
@SuppressWarnings("unused")
private final List<Foo> foos;
public GetXyzResponseBean(List<Foo> foos) { this.foos = ...
}
忽略命名空间,[local-name() =
是原始问题的开头,直接使用//*
元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<SyncX1POMATREC>
<X1POMATRECSet>
<PO>
<SITEID>
<xsl:value-of select="//*[local-name() = 'SITEID']"/>
</SITEID>
<PONUM>
<xsl:value-of select="//*[local-name() = 'PONUM']"/>
</PONUM>
<REVISIONNUM>
<xsl:value-of select="//*[local-name() = 'REVISIONNUM']"/>
</REVISIONNUM>
<POID>
<xsl:value-of select="//*[local-name() = 'POID']"/>
</POID>
<RECEIPT>
<POLINENUM>
<xsl:value-of select="//*[local-name() = 'POLINENUM']"/>
</POLINENUM>
<ITEMNUM>
<xsl:value-of select="//*[local-name() = 'ITEMNUM']"/>
</ITEMNUM>
</RECEIPT>
</PO>
</X1POMATRECSet>
</SyncX1POMATREC>
</xsl:template>
</xsl:stylesheet>