2012-11-14 48 views
3

我已经阅读了大量文章并尝试了很多东西,但仍然无法获取xsl以在参数中查找值。我从java的sun xalan开始,从来没有得到它的工作,所以我切换到撒克逊无济于事。我想将两个xml文档合并成一个xls文档。从来不在文件系统上,这是针对构建xml字符串/文档的Web应用程序。我曾尝试将DTMAxisIterator,DomSource,Doc传递给xsl,string中的节点集。它在NotePad ++中使用xsl文档()工作正常,但我不想将xml保存在系统上。将xml文档作为参数传递给xsl

XSL

<xsl:param name="RsXml" select="/"/> 

<xsl:template match="/policy/vehicles"> 
<vehicle type="DP" type_code="DP"/> 

     <xsl:for-each select="$RsXml/InsuranceSvcRs /com.csc_PolicyOrderCurrentCarrierInqRs/PersVeh"> 

      <vin> 
       <xsl:value-of select="VehIdentificationNumber"/> 
      </vin> 
      <veh_year> 
       <xsl:value-of select="ModelYear"/> 
      </veh_year> 
      <make> 
       <xsl:value-of select="Manufacturer"/> 
      </make> 
      <model> 
       <xsl:value-of select="Model"/> 
      </model> 
      <costnew>    
       <xsl:value-of select="CostNewAmt/Amt"/> 
      </costnew> 
      <symbol> 
       <xsl:value-of select="VehSymbolCd"/> 
      </symbol> 
      <wheregaraged></wheregaraged> 
      <liabilityonly></liabilityonly> 
      <collision></collision> 
      <comprehensive></comprehensive> 
      <rentalreimbursement></rentalreimbursement> 
      <towing></towing> 
      <altered></altered> 
      <title></title> 
      <enginesize> 
       <xsl:value-of select="NumCylinders"/> 
      </enginesize> 
      <trailertype/> 
      <trtonnage/> 
      <mctype/> 
      <mcenginecc/> 
      <vehicleuse></vehicleuse> 
      <mhawnings></mhawnings> 
      <vseat15></vseat15> 
      <vseat15text/> 
      <extraequipment></extraequipment> 
      <mcsidecar></mcsidecar> 
      <atvwheels/> 
      <damage/> 
      <endorsements/> 
      <avtotal/> 
      <v_underwriting> 
       <altered></altered> 
       <alteredlist/> 
       <alteredexplain/> 
       <businessuse></businessuse> 
       <haulstudents></haulstudents> 
       <pulltrailers></pulltrailers> 
       <trailerendorsement/> 
      </v_underwriting> 
      <driverid></driverid> 
      <gen_classcode></gen_classcode> 
      <classcode></classcode> 
      <primary_veh></primary_veh> 
      <rates> 
       <bi></bi> 
       <pd></pd> 
       <med></med> 
       <ubi></ubi> 
       <upd></upd> 
       <comp></comp> 
       <coll></coll> 
       <comm></comm> 
       <rr></rr> 
       <tl></tl> 
      </rates> 
      <xferdis></xferdis> 
      <atv_young_dr></atv_young_dr> 
      <mrcd_date/> 
      <hasdamage></hasdamage> 
      <comp_symbol></comp_symbol> 
      <str_legal></str_legal> 
      <addresses/> 


     </xsl:for-each>  
<xsl:apply-templates/> 

XML一个

  <?xml version="1.0" encoding="UTF-8"?> 
       <policy id="1735">  
       <vehicles>   
       </vehicles> 
       </policy> 

XML两个

 <ACORD> 
    <InsuranceSvcRs> 
     <com.csc_PolicyOrderCurrentCarrierInqRs> 
     <PersVeh id="001"> 
      <ItemIdInfo> 
       <InsurerId>001</InsurerId> 
      </ItemIdInfo> 
      <Manufacturer>FORD</Manufacturer> 
      <Model>WINDSTAR</Model> 
      <ModelYear>1999</ModelYear> 
      <VehBodyTypeCd>ES</VehBodyTypeCd> 
      <CostNewAmt> 
       <Amt>23660</Amt> 
      </CostNewAmt> 
      <NumDaysDrivenPerWeek /> 
      <EstimatedAnnualDistance> 
       <NumUnits /> 
       <UnitMeasurementCd /> 
      </EstimatedAnnualDistance> 
      <FullTermAmt> 
       <Amt /> 
      </FullTermAmt> 
      <TerritoryCd /> 
      <VehIdentificationNumber>1</VehIdentificationNumber> 
      <NumCylinders>6</NumCylinders> 
      <VehSymbolCd /> 
      <AntiLockBrakeCd>4-WHEEL STD</AntiLockBrakeCd> 
      <DaytimeRunningLightInd /> 
      <DistanceOneWay> 
       <NumUnits /> 
       <UnitMeasurementCd>MI</UnitMeasurementCd> 
      </DistanceOneWay> 
      <AntiTheftDeviceCd>PASS-KEY</AntiTheftDeviceCd> 
      <VehPerformanceCd /> 
      <VehUseCd /> 
      <AirBagTypeCd>BOTH</AirBagTypeCd> 
      <com.csc_VehBodyTypeFreeformInd /> 
     </PersVeh>   
    </com.csc_PolicyOrderCurrentCarrierInqRs> 
    </InsuranceSvcRs> 
    </ACORD> 

public String transformResultXML(String xmlSource, Templates xsl,String policyXml) { 
     String result = ""; 

    try { 

      StringWriter writer = new StringWriter(); 
      StringReader reader2 = new StringReader(policyXml); 

      XmlHelper xh = new XmlHelper(); 
      Document xmlSrc = xh.loadDoc(xmlSource); 
      DOMSource source = new DOMSource(xmlSrc); 


      ByteArrayInputStream byteStream = new ByteArrayInputStream(xmlSource.getBytes()); 
      StringReader reader = new StringReader(xmlSource); 
      SAXSource source2 = new SAXSource(new XMLFilterImpl(), new InputSource(reader)); 

      TransformerFactory transFact = new com.icl.saxon.TransformerFactoryImpl(); 

      Transformer transformer = transFact.newTransformer(); 

      transformer.setParameter("RsXml",source2); 
     // transformer.setParameter("RsXml",xmlSrc); 
      transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
      transformer.transform(new javax.xml.transform.stream.StreamSource(reader2), 
        new javax.xml.transform.stream.StreamResult(writer)); 
      result = writer.toString(); 
      System.out.println(result); 

    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

    return result; 
} 

回答

2

我能够得到它与撒克逊工作看到下面的代码。我认为,关键是document.getDocumentElement()作为PARM

 public String transformResultXML(String xmlSource, Templates xsl,String policyXml) { 
     String result = ""; 

    try { 

      StringWriter writer = new StringWriter(); 
      StringReader reader2 = new StringReader(policyXml); 

      DocumentBuilderFactory dfactory = 
        DocumentBuilderFactory.newInstance("com.icl.saxon.om.DocumentBuilderFactoryImpl",null); 

      dfactory.setNamespaceAware(true); 

      DocumentBuilder docBuilder = dfactory.newDocumentBuilder(); 

      org.w3c.dom.Document document = docBuilder.parse(new InputSource(new StringReader(xmlSource))); 

      Transformer transformer = xsl.newTransformer(); 

      transformer.setParameter("RsXml", document.getDocumentElement()); 

      transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
      transformer.transform(new javax.xml.transform.stream.StreamSource(reader2), 
        new javax.xml.transform.stream.StreamResult(writer)); 
      result = writer.toString(); 
      System.out.println(result); 

    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

XSL片断

<xsl:param name="RsXml" /> 

<xsl:template match="/policy/vehicles"> 


     <xsl:for-each select="$RsXml/InsuranceSvcRs/com.csc_PolicyOrderCurrentCarrierInqRs/PersVeh"> 
+0

提供一个DOM作为Saxon转换的输入可能意味着您的转换运行速度慢10倍 - 这不被推荐。我会建议使用s9api接口。 –

0

将参数传递给XSL样式表时,该值是一个字符串,不会被分析为DOM。目前这在标准XSLT中是不可能的。可能有一个扩展可以做到这一点,但我不知道。

2

当您使用JAXP接口,可以提供对参数值未在API规范中定义Saxon的支持可能与Xalan不同。一般来说,我认为你会发现撒克逊的s9api界面更容易使用。当然,它提供参数的方法是强类型的,它可以提供更清晰的内容。如果您想提供一个节点,它应该是XdmNode的一个实例,并且您可以通过使用s9api DocumentBuilder解析词法XML或通过包装DOM节点来创建XdmNode。

+0

感谢您的信息。 –

相关问题