我正在尝试编写xslt
来修改xml
。这是同步调用接收的响应。需要修改此xml的结构,并且需要传输数据,以便原始系统可以使用响应。
输入XML如下:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
<SOAP-ENV:Body>
<ns0:ValidateMeterItemResponse xmlns:ns0="http://www.apsc.com/CCB/ValidateMeterItem/InOut">
<ns1:ValidateMeterItemRes xmlns:ns1="http://www.apsc.com/CCB/MeterServices/InOut">
<ns1:verificationStatus>M2IV</ns1:verificationStatus>
<ns1:errorCode>256.0</ns1:errorCode>
<ns1:errorText>Service Point ID 1245765566 field invalid</ns1:errorText>
<ns1:readingDetails/>
</ns1:ValidateMeterItemRes>
</ns0:ValidateMeterItemResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
预期输出XML是:
<responseMessage/">
<response>
<errorCode>256.0</errorCode>
</response>
</responseMessage>
我现在只想提取一个节点。
下面是我写的XSLT。我首先按原样复制了所有元素,然后尝试取消<ValidateMeterItemResponse>
节点。然后我尝试使用xsl value of
从输入xml中选择某些元素来构建我的xml(具有不同的结构)。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://xmlns.oracle.com/OUMWM/Message"
xmlns:ns1="http://xmlns.oracle.com/OUMWM/Message1">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*/*">
<xsl:apply-templates select="node()" />
</xsl:template>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<responseMessage>
<response>
<errorCode>
<xsl:value-of select="SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:ValidateMeterItemRes/ns1:errorCode" />
</errorCode>
</response>
</responseMessage>
</xsl:template>
</xsl:stylesheet>
即使所有路径都正确,我也无法提取元素。我确信我已经错过了一些尝试完成此事的东西。我哪里出错了?
答案 0 :(得分:1)
您遇到的第一个问题是您的命名空间URI在XML和XSLT之间有所不同。在XML中,您已经定义了这些..
xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns0="http://www.apsc.com/CCB/ValidateMeterItem/InOut"
xmlns:ns1="http://www.apsc.com/CCB/MeterServices/InOut"
但是在XSLT中你有这些......
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns0="http://xmlns.oracle.com/OUMWM/Message"
xmlns:ns1="http://xmlns.oracle.com/OUMWM/Message1"
必须匹配的名称空间URI,而不是前缀。
另一个问题是,在最终模板的xpath表达式中,您错过了ns0:ValidateMeterItemResponse
。 xpath表达式也以SOAP-ENV:Envelope
开头,因为模板已经与根元素匹配,所以不需要<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns0="http://www.apsc.com/CCB/ValidateMeterItem/InOut"
xmlns:ns1="http://www.apsc.com/CCB/MeterServices/InOut">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/*">
<responseMessage>
<response>
<errorCode>
<xsl:value-of select="SOAP-ENV:Body/ns0:ValidateMeterItemResponse/ns1:ValidateMeterItemRes/ns1:errorCode" />
</errorCode>
</response>
</responseMessage>
</xsl:template>
</xsl:stylesheet>
,因此xpath表达式与之相关。
试试这个XSLT
request.META