XSLT НЕ РАБОТАЕТ ... для атрибута - PullRequest
3 голосов
/ 08 июня 2011

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

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

это мой 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>         

Ответы [ 3 ]

0 голосов
/ 08 июня 2011

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

<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 - со всеми необходимыми элементами-литерал-результат-элементыкак самый простой способ разместить их в нужных новых пространствах имен и избавиться от других узлов пространства имен, которыми владеют исходные элементы.

0 голосов
/ 08 июня 2011

В точности с вашим преобразованием (и со спецификациями 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"/>
0 голосов
/ 08 июня 2011

Ваш 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. -->
<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...