【问题标题】:Transform SOAP to XML using XSLT使用 XSLT 将 SOAP 转换为 XML
【发布时间】:2015-09-01 06:09:05
【问题描述】:

我一直坚持将 SOAP 请求转换为可以上传到 Filemaker 数据库的可用 XML 文件。我一直在寻找几天,但我找不到有效的解决方案。我已经复制了下面的 SOAP 请求示例,以及下面的所需输出。任何帮助将不胜感激!

到目前为止,我所做的只是使用以下 XSL 生成内容:

<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns ="http://www.somedomainename.com">

<xsl:template match="@*|comment()|processing-instruction()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template> 
</xsl:stylesheet>

SOAP 请求:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
  <ns0:course_application_list xmlns:ns0="http://au.edu.sydney/schemas/studentcoursemanagement/courseppplication/courseapplicationdetails/1.0">
     <ns0:course_application>
        <ns0:application_form_seqno>01</ns0:application_form_seqno>
        <ns0:course_application_seqno>01</ns0:course_application_seqno>
        <ns0:application_course>MAEDUCAT-03</ns0:application_course>
        <ns0:commence_year>2014</ns0:commence_year>
        <ns0:sid>11223344</ns0:sid>
        <ns0:application_type>I</ns0:application_type>
        <ns0:application_status>AF</ns0:application_status>
        <ns0:decision1>U</ns0:decision1>
</ns0:course_application>
  </ns0:course_application_list>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

所需的输出 XML:

 <course_application_list>
 <course_application>
    <application_form_seqno>01</application_form_seqno>
    <course_application_seqno>01</course_application_seqno>
    <application_course>MAEDUCAT-03</application_course>
    <commence_year>2014</commence_year>
    <sid>11223344</sid>
    <application_type>I</application_type>
    <application_status>AF</application_status>
    <decision1>U</decision1>
</course_application>
</course_application_list>

【问题讨论】:

  • "我已经找了好几天了,但找不到有效的解决方案。" 您是否考虑过花一两个小时实际学习 XSLT?复制和粘贴不会让你走得太远。 -- “一个可用的 XML 文件,我可以上传到 Filemaker 数据库中。” 不知道“上传”是什么意思。为了将 XML 导入到 Filemaker,您的输出必须符合 Filemaker 的 FMPXMLRESULT 架构 - 您向我们展示的输出远非如此。
  • 是的,我一直在努力。当 XML 包含一个 SOAP 信封和名称空间时,这是一个挑战。我已经找到了在 XML 中操作其中任何一个的方法,但不是在将它们组合在一起时。我是一名业务分析师——我以前编程过,但我不是核心技术人员。我正在尝试这样做,因为没有可用的开发人员。
  • 是的,你是对的,它需要符合架构。我认为如果我真的可以对 XML 进行任何更改就可以了。我所能做的就是提取属性中的数据。
  • 您不需要对 XML 进行任何更改。这就是 XSLT 所做的:它将给定的 XML 转换为目标模式。您只需要更改样式表即可生成正确的输出。请参阅此处了解简介:web.archive.org/web/20101013013430/http://my.advisor.com/doc/… -- "没有可用的开发人员" 请原谅?
  • 我已将您的问题回滚为原始形式,因为您已经 - 非常正确 - 发布了 new question with the new requirements

标签: xml xslt soap xslt-1.0


【解决方案1】:

你需要适当地管理你的命名空间,你可以做的大概是这样的:

<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:somedo ="http://au.edu.sydney/schemas/studentcoursemanagement/courseppplication/courseapplicationdetails/1.0"
        exclude-result-prefixes="somedo">

  <!-- This will skip all SOAP-env related elements --> 
  <xsl:template match="soap:*">
    <xsl:apply-templates select="*" />
  </xsl:template>

  <!-- this will copy all elements without the namespace declaration -->
  <xsl:template match="somedo:*">
   <xsl:element name="{local-name()}">
     <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="@*|comment()|processing-instruction()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

目前我得到的结果:

<?xml version="1.0" encoding="UTF-8"?>
<course_application_list>
        <course_application>
            <application_form_seqno>01</application_form_seqno>
            <course_application_seqno>01</course_application_seqno>
            <application_course>MAEDUCAT-03</application_course>
            <commence_year>2014</commence_year>
            <sid>11223344</sid>
            <application_type>I</application_type>
            <application_status>AF</application_status>
            <decision1>U</decision1>
        </course_application>
    </course_application_list>

【讨论】:

  • 你的第一个和最后一个模板没有做任何事情,可以删除。
  • @michael.hor257k 他们什么都不做,因为输入文档中既没有属性,也没有处理指令,也没有 cmets -- 是你的意思吗?
  • 第一个可以删除,因为有一个内置的模板规则可以做到这一点。最后一个可以删除,因为没有属性(而且他们可能不想将 PI 或 cmets 导入数据库)。
  • 我同意——我保留它们是因为我不想对 XML 输入格式做任何假设,这只是一个示例(我根本不知道 Filemaker,我只有基本的有关 SOAP 的知识)。
  • 非常感谢@potame!我已经尝试使用在线 XSLT 测试仪执行您所说的操作,产生的结果是:01 01 MAEDUCAT-03 2014 11223344 I AF U ...我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 2016-08-24
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多