XSLT НЕ РАБОТАЕТ... для атрибута

У меня есть эта полезная нагрузка XSLT и XML, которую я хочу преобразовать. но выходной XML-код не содержит атрибута для механизма элемента.

любая помощь будет оценена?

это мой xslt

<!--?xml version="1.0" encoding="UTF-8" ?-->
 <!--?oracle-xsl-mapper
 <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. ---->
 <mapsources>
 
 <schema location="../HTTPBinding.wsdl">
 <rootelement name="Envelope" namespace="http://HPES.org/">
 
 </rootelement></schema></mapsources>
 <maptargets>
 <target type="WSDL">
 <schema location="../Service1.wsdl">
 <rootelement name="Envelope" namespace="http://HPES.org/">
 </rootelement></schema></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>
 
 <soapp1>
 <soapp2>
 <engine>
 <xsl:attribute name="value">
 <xsl:value-of select="/inp2:Envelope/Body/soapP1/soapP2/engine/@value">
 </xsl:value-of></xsl:attribute>
 <xsl:attribute name="txnElapsedTime">
 <xsl:value-of select="/inp2:Envelope/Body/soapP1/soapP2/engine/@txnElapsedTime">
 </xsl:value-of></xsl:attribute>
 <xsl:value-of select="/inp2:Envelope/Body/soapP1/soapP2/engine">
 </xsl:value-of></engine>
 </soapp2>
 </soapp1>
 
 </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">
 </engine></soapp2>
 </soapp1>
 </soap:body>
 </soap:envelope>

это мой вывод, где атрибут потерян.....

<!--?xml version="1.0" encoding="utf-8"?-->
 <inp2:envelope xmlns:inp2="http://HPES.org/">
 
 <soapp1>
 <soapp2>
 <engine value="" txnelapsedtime="">
 </engine>
 </soapp2>
 </soapp1>
 
 </inp2:envelope>
3 ответа

Кажется, что вам нужно это простое и короткое преобразование:

<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>
 
 <soapp1>
 <soapp2>
 <engine>
 <xsl:copy-of select="@*|node()">
 </xsl:copy-of></engine> 
 </soapp2>
 </soapp1>
 
 </inp2:envelope>
 </xsl:template>
</xsl:strip-space></xsl:output></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">
 </engine></soapp2>
 </soapp1>
 </soap:body>
</soap:envelope>

получен желаемый результат:

<inp2:envelope xmlns:inp2="http://HPES.org/">
 
 <soapp1>
 <soapp2>
 <engine value="1" txnelapsedtime="0.05">
 </engine></soapp2>
 </soapp1>
 
</inp2:envelope>

Объяснение. Только один шаблон, соответствующий engine - со всеми необходимыми элементами литерала-результата как самый простой способ иметь их в желаемых новых пространствах имен и избавиться от другого пространства имен узлов, которые принадлежат исходным элементам.


В соответствии с вашим преобразованием (и с помощью спецификаций 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, чтобы соответствующим образом выбрать элементы. Например:


Ваш XSLT использует неправильный XPATH для ссылки на атрибуты. Если я введу следующий XSLT (используя пространство имен soap вместо inp2) в этот онлайн-инструмент тестирования XSLT, я получаю результат я думаю, что вы ищете:

XSLT

<!--?xml version="1.0" encoding="UTF-8" ?-->
<!--?oracle-xsl-mapper
<!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. ---->


<!-- GENERATED BY ORACLE XSL MAPPER 11.1.1.4.0(build 110106.1932.5682) AT [TUE JUN 07 11:17:07 CDT 2011]. -->
?>

РЕЗУЛЬТАТ

licensed under cc by-sa 3.0 with attribution.