2011-06-08 109 views
3

我有這個XSLT和XML負載,我想要轉換。但是輸出xml不包含元素引擎的屬性。XSLT NOT WORKING ... for屬性

任何幫助將不勝感激?

這是我的XSLT

<?xml version="1.0" encoding="UTF-8" ?> 
    <?oracle-xsl-mapper 
    <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. --> 
    <mapSources> 
    <source type="WSDL"> 
    <schema location="../HTTPBinding.wsdl"/> 
    <rootElement name="Envelope" namespace="http://HPES.org/"/> 
    </source> 
    </mapSources> 
    <mapTargets> 
    <target type="WSDL"> 
    <schema location="../Service1.wsdl"/> 
    <rootElement name="Envelope" namespace="http://HPES.org/"/> 
    </target> 
    </mapTargets> 
    <!-- GENERATED BY ORACLE XSL MAPPER 11.1.1.4.0(build 110106.1932.5682) AT [TUE JUN 07 11:17:07 CDT 2011]. --> 
    ?> 
    <xsl:stylesheet version="1.0" 
    xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" 
    xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20" 
    xmlns:inp2="http://HPES.org/" 
    xmlns:mhdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.mediator.service.common.functions.MediatorExtnFunction" 
    xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable" 
    xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:dvm="http://www.oracle.com/XSL/Transform/java/oracle.tip.dvm.LookupValue" 
    xmlns:hwf="http://xmlns.oracle.com/bpel/workflow/xpath" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:med="http://schemas.oracle.com/mediator/xpath" 
    xmlns:ids="http://xmlns.oracle.com/bpel/services/IdentityService/xpath" 
    xmlns:bpm="http://xmlns.oracle.com/bpmn20/extensions" 
    xmlns:xdk="http://schemas.oracle.com/bpel/extension/xpath/function/xdk" 
    xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:inp1="http://tempuri.org/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:ora="http://schemas.oracle.com/xpath/extension" 
    xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator" 
    xmlns:tns="http://oracle.com/sca/soapservice/Application1/Project1/Service1" 
    xmlns:ldap="http://schemas.oracle.com/xpath/extension/ldap" 
    exclude-result-prefixes="xsi xsl inp2 xsd inp1 wsdl tns bpws xp20 mhdr bpel oraext dvm hwf med ids bpm xdk xref ora socket ldap"> 
    <xsl:template match="/"> 
    <inp2:Envelope> 
    <Body> 
    <soapP1> 
    <soapP2> 
    <engine> 
    <xsl:attribute name="value"> 
    <xsl:value-of select="/inp2:Envelope/Body/soapP1/soapP2/engine/@value"/> 
    </xsl:attribute> 
    <xsl:attribute name="txnElapsedTime"> 
    <xsl:value-of select="/inp2:Envelope/Body/soapP1/soapP2/engine/@txnElapsedTime"/> 
    </xsl:attribute> 
    <xsl:value-of select="/inp2:Envelope/Body/soapP1/soapP2/engine"/> 
    </engine> 
    </soapP2> 
    </soapP1> 
    </Body> 
    </inp2:Envelope> 
    </xsl:template> 
    </xsl:stylesheet> 

這是我輸入XML

<soap:Envelope xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <soapP1> 
    <soapP2> 
    <engine value="1" txnElapsedTime="0.05"/> 
    </soapP2> 
    </soapP1> 
    </soap:Body> 
    </soap:Envelope> 

這是我的輸出,其中的屬性都將丟失.....

<?xml version="1.0" encoding="utf-8"?> 
    <inp2:Envelope xmlns:inp2="http://HPES.org/"> 
    <Body> 
    <soapP1> 
    <soapP2> 
    <engine value="" txnElapsedTime=""> 
    </engine> 
    </soapP2> 
    </soapP1> 
    </Body> 
    </inp2:Envelope>   

回答

0

似乎你需要的是這個簡單和短的轉換

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:inp2="http://HPES.org/" 
exclude-result-prefixes="inp2"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="engine"> 
    <inp2:Envelope> 
    <Body> 
     <soapP1> 
      <soapP2> 
      <engine> 
       <xsl:copy-of select="@*|node()"/> 
      </engine> 
      </soapP2> 
     </soapP1> 
    </Body> 
    </inp2:Envelope> 
</xsl:template> 
</xsl:stylesheet> 

當施加到所提供的XML文檔

<soap:Envelope 
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <soapP1> 
      <soapP2> 
       <engine value="1" txnElapsedTime="0.05"/> 
      </soapP2> 
     </soapP1> 
    </soap:Body> 
</soap:Envelope> 

有用結果產生

<inp2:Envelope xmlns:inp2="http://HPES.org/"> 
    <Body> 
     <soapP1> 
     <soapP2> 
      <engine value="1" txnElapsedTime="0.05"/> 
     </soapP2> 
     </soapP1> 
    </Body> 
</inp2:Envelope> 

說明:只是一個模板,匹配engine - 機智h所有必要的文字結果元素作爲讓他們進入所需的新命名空間並擺脫原始元素擁有的其他命名空間節點的最簡單方法。

0

你的XSLT正在使用錯誤的XPATH來引用屬性。如果我輸入下面的XSLT(使用命名空間soap代替inp2)爲this online XSLT test tool,我得到的結果,我認爲你正在尋找:

XSLT

<?xml version="1.0" encoding="UTF-8" ?> 
<?oracle-xsl-mapper 
<!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. --> 
<mapSources> 
<source type="WSDL"> 
<schema location="../HTTPBinding.wsdl"/> 
<rootElement name="Envelope" namespace="http://HPES.org/"/> 
</source> 
</mapSources> 
<mapTargets> 
<target type="WSDL"> 
<schema location="../Service1.wsdl"/> 
<rootElement name="Envelope" namespace="http://HPES.org/"/> 
</target> 
</mapTargets> 
<!-- GENERATED BY ORACLE XSL MAPPER 11.1.1.4.0(build 110106.1932.5682) AT [TUE JUN 07 11:17:07 CDT 2011]. --> 
?> 
<xsl:stylesheet version="1.0" 
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" 
xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20" 
xmlns:inp2="http://HPES.org/" 
xmlns:mhdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.mediator.service.common.functions.MediatorExtnFunction" 
xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable" 
xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:dvm="http://www.oracle.com/XSL/Transform/java/oracle.tip.dvm.LookupValue" 
xmlns:hwf="http://xmlns.oracle.com/bpel/workflow/xpath" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:med="http://schemas.oracle.com/mediator/xpath" 
xmlns:ids="http://xmlns.oracle.com/bpel/services/IdentityService/xpath" 
xmlns:bpm="http://xmlns.oracle.com/bpmn20/extensions" 
xmlns:xdk="http://schemas.oracle.com/bpel/extension/xpath/function/xdk" 
xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:inp1="http://tempuri.org/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:ora="http://schemas.oracle.com/xpath/extension" 
xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator" 
xmlns:tns="http://oracle.com/sca/soapservice/Application1/Project1/Service1" 
xmlns:ldap="http://schemas.oracle.com/xpath/extension/ldap" 
exclude-result-prefixes="xsi xsl inp2 xsd inp1 wsdl tns bpws xp20 mhdr bpel oraext dvm hwf med ids bpm xdk xref ora socket ldap"> 
<xsl:template match="/"> 
<inp2:Envelope> 
<Body> 
<soapP1> 
<soapP2> 
<engine> 
<xsl:attribute name="value"> 
<xsl:value-of select="/soap:Envelope/Body/soapP1/soapP2/engine/@value"/> 
</xsl:attribute> 
<xsl:attribute name="txnElapsedTime"> 
<xsl:value-of select="/soap:Envelope/Body/soapP1/soapP2/engine/@txnElapsedTime"/> 
</xsl:attribute> 
<xsl:value-of select="/soap:Envelope/Body/soapP1/soapP2/engine"/> 
</engine> 
</soapP2> 
</soapP1> 
</Body> 
</inp2:Envelope> 
</xsl:template> 
</xsl:stylesheet> 

結果

<?xml version="1.0" encoding="UTF-8"?> 
<inp2:Envelope xmlns:inp2="http://HPES.org/"> 
<Body> 
<soapP1> 
<soapP2> 
<engine value="1" txnElapsedTime="0.05"/> 
</soapP2> 
</soapP1> 
</Body> 
</inp2:Envelope> 
+0

如果使用兼容的XSLT處理器(例如Saxon)進行處理,這樣的模板不會產生想要的結果。 – 2011-06-08 05:28:32

0

在保真度的變換(以及XSLT規範),以使事情工作,你需要:

  • 聲明命名空間前綴的URI http://schemas.xmlsoap.org/soap/envelope/
  • 添加新的前綴排除列表
  • 按申報前綴
選擇元素

所以,你必須以下行添加到您的(巨大)名單:

xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 

,改變exclude-result-prefixes到:

exclude-result-prefixes="soap xsi xsl inp2 xsd inp1 wsdl tns bpws xp20 mhdr bpel oraext dvm hwf med ids bpm xdk xref ora socket"> 

,然後更改您的XPath來選擇相應的元素。例如:

<xsl:value-of select="/soap:Envelope/soap:Body/soapP1/soapP2/engine/@value"/>