XSL转换失败,有多个模板

时间:2017-09-27 14:00:45

标签: xml xslt xslt-1.0

我们正面临着这个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子句时,都会给出不一致的结果。我不确定自己是否朝着正确的方向前进。

1 个答案:

答案 0 :(得分:2)

documentListResponse及其所有后代都位于默认命名空间http://ws.ouaf.oracle.com中。您需要将该命名空间绑定到前缀并在XPath中使用它。

您还应该移动<documentList>内的xsl:for-each

另请注意,由于您未使用resS前缀,因此可以删除这些绑定。

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

工作示例:http://xsltransform.net/3MvmrAC/1