SOAP响应转换为CSV

时间:2013-04-29 20:31:22

标签: xml xslt soap csv

        <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
       <SOAP-ENV:Body>
          <ns0:DataResponse xmlns:ns0="http://somenamspace/v1.0">
             <ns0:ResponseId>
                <ns0:RequestID>12345</ns0:RequestID>
             </ns0:ResponseId>
             <ns0:Payload>
                <ns1:Product xmlns:ns1="http://anothernamespace/v1.x">
                   <ns1:ProductName>productName</ns1:ProductName>
                   <ns1:ProductIdentifier>12222</ns1:ProductIdentifier>
                   <ns1:ProdInst>
                      <ns1:Type>Conv</ns1:Type>
                      <ns1:Descr>Conventional Loan</ns1:Descr>
                      <ns1:AllowedTypes>
                         <ns1:ScheduleSchedule>true</ns1:ScheduleSchedule>
                      </ns1:AllowedTypes>
                      <ns1:prdExist>false</ns1:prdExist>
                      <ns1:AdditionalAttributes>
                         <ns1:AdditionalAttribute name="gura" value="C"/>
                      </ns1:AdditionalAttributes>
                   </ns1:ProdInst>
                   <ns1:ProductGroups>
                      <ns1:ProductGroupName>1111</ns1:ProductGroupName>
                      <ns1:ProductGroupName>2222</ns1:ProductGroupName>
                   </ns1:ProductGroups>
                </ns1:Product>
                 <ns1:Product>
                   .......
                 </ns1:Product>
             </ns0:Payload>
          </ns0:DataResponse>
       </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
------------------------------------
<xsl:stylesheet version="1.0"

        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:ns0="http://somenamespace/v1.0"
        xmlns:ns1="http://anothernamespace/v1.x"
        exclude-result-prefixes="ns1">
        <xsl:output omit-xml-declaration="yes" indent="no" method="text"/>

        <xsl:template match="ns1:Products">
            <xsl:value-of select="."/>
        </xsl:template>

    </xsl:stylesheet>
----------------------------------------------------
  <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns1="http://namespace/v1.x"
    exclude-result-prefixes="ns1">
    <xsl:output omit-xml-declaration="yes" indent="no" method="text"/>
    <xsl:template match="/">
            <xsl:for-each select="ns1:Product">
                    <xsl:value-of select="ns1:ProductName" />
                    <xsl:text>,</xsl:text>
                    <xsl:value-of select="ns1:ProdInst/ns1:Type" />
                    <xsl:text>,</xsl:text>
                    <xsl:value-of select="ns1:ProdInst/ns1:Descr" />
                    <xsl:text>,</xsl:text>
                    <xsl:value-of select="ns1:ProdInst/ns1:AdditionalAttributes/@gura" />
                    <xsl:text>,</xsl:text>
                    <xsl:for-each select="ns1:ProductGroups">
                      <xsl:value-of select="."/>
                    </xsl:for-each>,                    
            </xsl:for-each>
    </xsl:template>

基本上我正在尝试编写XSL以将所有这些“Product”内部属性​​值转换为CSV格式。我已经努力克服使用命名空间但仍然无法以完美的格式编写,有时候下一行的样式,如果我尝试了泛型,那么问题就是无法读取additionalAtrributes值。 对此的任何帮助都会很棒。

期望输出为  所有标签内部属性以CSV格式排列,并按顺序排列。

 <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:ns0="http://somenamspace/v1.0"
        xmlns:ns1="http://anothernamespace/v1.x"
        exclude-result-prefixes="ns1">


      <xsl:output  method="text" indent="no"/>
      <xsl:strip-space elements="*"/>

      <xsl:template match="/">
          <xsl:apply-templates select="ns1:Product"/>
      </xsl:template> 

      <xsl:template match="ns1:Product">
        <xsl:value-of select="*"/>
        <xsl:apply-templates select="ns1:ProdInst"/>
        <xsl:apply-templates select="ns1:ProductGroups"/>
      </xsl:template>

      <xsl:template match="ns1:ProdInst">
        <xsl:value-of select="."/>
        <xsl:apply-templates select="ns1:AllowedTypes"/>
        <xsl:apply-templates select="ns1:AdditionalAttributes"/>
      </xsl:template>

      <xsl:template match="ns1:AllowedTypes">
        <xsl:value-of select="."/>
      </xsl:template>

      <xsl:template match="ns1:AdditionalAttributes">
        <xsl:for-each select="@*">
           <xsl:copy-of select="." />
       </xsl:for-each>
      </xsl:template>


</xsl:stylesheet>

我已经尝试过如上所述并且至少在同一行中得到了所有内容,但仍然不是逗号分隔,也不包括“AdditionalAttributes”。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

请看一下这个解决方案:

<强> XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns0="http://somenamspace/v1.0" xmlns:ns1="http://anothernamespace/v1.x"
  exclude-result-prefixes="ns1">


  <xsl:output method="text" indent="no"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:for-each select="//ns1:Product">
      <xsl:call-template name="getProduct">
        <xsl:with-param name="Product" select="self::*"/>
      </xsl:call-template>
      <xsl:text>

      </xsl:text>
    </xsl:for-each>
  </xsl:template>

  <xsl:template name="getProduct">
    <xsl:param name="Product"/>
    <xsl:variable name="ProductContent">
      <xsl:for-each select="$Product/*">
        <xsl:choose>
          <xsl:when test="*">
            <xsl:call-template name="getChild">
              <xsl:with-param name="Child" select="*"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <xsl:if test="@*">
              <xsl:for-each select="@*">
                <xsl:value-of select="."/>
                <xsl:text>,</xsl:text>
              </xsl:for-each>
              <xsl:text>,</xsl:text>
            </xsl:if>
            <xsl:value-of select="."/>
            <xsl:text>,</xsl:text>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </xsl:variable>
    <xsl:value-of select="substring($ProductContent,0,string-length($ProductContent))"/>
  </xsl:template>

  <xsl:template name="getChild">
    <xsl:param name="Child"/>
    <xsl:for-each select="$Child/node()">
      <xsl:choose>
        <xsl:when test="* and not(@*)">
          <xsl:call-template name="getChild">
            <xsl:with-param name="Child" select="*"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="text()">
          <xsl:value-of select="."/>
          <xsl:text>,</xsl:text>
        </xsl:when>
        <xsl:when test="*">
          <xsl:for-each select="@*">
            <xsl:value-of select="."/>
            <xsl:text>,</xsl:text>
          </xsl:for-each>
          <xsl:call-template name="getChild">
            <xsl:with-param name="Child" select="*"/>
          </xsl:call-template>
        </xsl:when>
        <xsl:when test="not(*) and @*">
          <xsl:for-each select="@*">
            <xsl:value-of select="."/>
            <xsl:text>,</xsl:text>
          </xsl:for-each>
        </xsl:when>
        <xsl:otherwise>
          <xsl:if test="@*">
            <xsl:for-each select="@*">
              <xsl:value-of select="."/>
              <xsl:text>,</xsl:text>
            </xsl:for-each>
            <xsl:text>,</xsl:text>
          </xsl:if>
          <xsl:value-of select="."/>
          <xsl:text>,</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
    <xsl:if test="$Child/@* and not($Child/node())">
      <xsl:for-each select="$Child/@*">
        <xsl:value-of select="."/>
        <xsl:text>,</xsl:text>
      </xsl:for-each>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

<强>输出:

productName,12222,Conv,Conventional Loan,true,false,gura,C,1111,2222

      produ222222222ctName,12222,Conv,Conventional Loan,true,false,gura,C,1111,2222