我们正面临着这个XML的XSL转换问题
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<documentListResponse xmlns="http://ws.ouaf.oracle.com/">
<documentListResult>
<docdata>
<account>106743720016</account>
<date>2017/07/18</date>
<format>afp</format>
<file>20170719041902</file>
<pointer>00064CE900012D14</pointer>
<pages>4</pages>
</docdata>
<docdata>
<account>104243722316</account>
<date>2017/07/28</date>
<format>afp</format>
<file>20170712331331902</file>
<pointer>00064CE900012D14</pointer>
<pages>4</pages>
</docdata>
<moredata>0</moredata>
</documentListResult>
</documentListResponse>
</S:Body>
</S:Envelope>
到这个XML
<responseMessage>
<documentList>
<filename>20170719041902</filename>
<format>afp</format>
<filePointer>00064CE900012D14</filePointer>
<totalPages>4</totalPages>
</documentList>
<documentList>
<filename>20170712331331902</filename>
<format>afp</format>
<filePointer>00064CE900012D14</filePointer>
<totalPages>4</totalPages>
</documentList>
</responseMessage>
使用XSLT如下(尝试选择多个节点名称深度嵌入XML树中的节点)。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:res="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
exclude-result-prefixes="S">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="documentListResult">
<responseMessage>
<documentList>
<xsl:for-each select="docdata">
<filename>
<xsl:value-of select="file"/>
</filename>
<format>
<xsl:value-of select="format"/>
</format>
<filePointer>
<xsl:value-of select="pointer"/>
</filePointer>
<totalPages>
<xsl:value-of select="pages"/>
</totalPages>
</xsl:for-each>
</documentList>
</responseMessage>
</xsl:template>
有人可以在这里指导我吗?我正在使用的所有转换函数似乎都不利于我。每次我在模板中更改select子句时,都会给出不一致的结果。我不确定自己是否朝着正确的方向前进。
答案 0 :(得分:2)
documentListResponse
及其所有后代都位于默认命名空间http://ws.ouaf.oracle.com
中。您需要将该命名空间绑定到前缀并在XPath中使用它。
您还应该移动<documentList>
内的xsl:for-each
。
另请注意,由于您未使用res
或S
前缀,因此可以删除这些绑定。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:o="http://ws.ouaf.oracle.com/"
exclude-result-prefixes="o">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="o:documentListResult">
<responseMessage>
<xsl:for-each select="o:docdata">
<documentList>
<filename>
<xsl:value-of select="o:file"/>
</filename>
<format>
<xsl:value-of select="o:format"/>
</format>
<filePointer>
<xsl:value-of select="o:pointer"/>
</filePointer>
<totalPages>
<xsl:value-of select="o:pages"/>
</totalPages>
</documentList>
</xsl:for-each>
</responseMessage>
</xsl:template>
</xsl:stylesheet>