Извлечь подстроку с помощью XSLT / XPath с помощью преобразования XSLT (для использования в WSO2)

Я совсем новичок в XSLT/Xpath....

У меня есть следующее XML-сообщение...

<?xml version="1.0" encoding="utf-8"?>
 <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
  <soapenv:Body>
   <request xmlns="http://ws.apache.org/ns/synapse">
    <gam:process xmlns:gam="http://gamopera.ifpl.csi.it">
     <!--Zero or more repetitions:-->
     <gam:id>1</gam:id>
     <gam:id>3</gam:id>
     <gam:id>5</gam:id>
     <gam:id>7</gam:id>
     <gam:id>438</gam:id>
     <gam:id>2</gam:id>
     <gam:id>4</gam:id>
     <gam:id>6</gam:id>
     <gam:id>8</gam:id>
    </gam:process>
    <ax2586:good xmlns:ax2586="http://gamopera.ifpl.csi.it">
     <ax2586:id>1</ax2586:id>
     <ax2586:id>3</ax2586:id>
     <ax2586:id>5</ax2586:id>
     <ax2586:id>7</ax2586:id>
    </ax2586:good>
   </request>
  </soapenv:Body>
 </soapenv:Envelope>

и я хотел бы получить что-то вроде этого

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
 <soapenv:Body>
  <ns:processResponse xmlns:ns="http://gamopera.ifpl.csi.it">
   <ns:return xsi:type="ax2586:Result" xmlns:ax2586="http://dto.gamopera.ifpl.csi.it/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <ax2586:good xsi:type="ax2586:ElencoId" xmlns:ax2586="http://gamopera.ifpl.csi.it">
           <ax2586:good>
              <ax2586:id>1</ax2586:id>
              <ax2586:id>3</ax2586:id>
              <ax2586:id>5</ax2586:id>
              <ax2586:id>7</ax2586:id>
           </ax2586:good>
        </ax2586:good>
        <ax2586:message>Message Store does not exist.</ax2586:message>
        <ax2586:statusCode>0</ax2586:statusCode>
        <ax2586:wrong xsi:type="ax2586:ElencoId">
           <ax2586:wrong xmlns:ax2586="http://gamopera.ifpl.csi.it">
              <gam:id xmlns:gam="http://gamopera.ifpl.csi.it" xmlns="http://ws.apache.org/ns/synapse">438</gam:id>
              <gam:id xmlns:gam="http://gamopera.ifpl.csi.it" xmlns="http://ws.apache.org/ns/synapse">2</gam:id>
              <gam:id xmlns:gam="http://gamopera.ifpl.csi.it" xmlns="http://ws.apache.org/ns/synapse">4</gam:id>
              <gam:id xmlns:gam="http://gamopera.ifpl.csi.it" xmlns="http://ws.apache.org/ns/synapse">6</gam:id>
              <gam:id xmlns:gam="http://gamopera.ifpl.csi.it" xmlns="http://ws.apache.org/ns/synapse">8</gam:id>
           </ax2586:wrong>
        </ax2586:wrong>
     </ns:return>
  </ns:processResponse>

Ища в Интернете сейчас, я построил это XSLT-преобразование

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.0">
  <xsl:template match="/">
   <xsl:variable name="ns1" select="//*[local-name()='process']/*"/>
   <xsl:variable name="ns2" select="//*[local-name()='good']/*"/>
   <xsl:variable name="difference" select="$ns1[not(.=$ns2)],$ns2[not(.=$ns1)]"/>
   <ax2586:wrong xmlns:ax2586="http://gamopera.ifpl.csi.it">
     <ax2586:wrong><xsl:copy-of select="$difference"/></ax2586:wrong>
   </ax2586:wrong>
  </xsl:template>
</xsl:stylesheet> 

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

ПРИМЕЧАНИЕ. Я должен использовать его в прокси-сервере WSO2.

Любое предложение или альтернативный способ получить тот же результат?

заранее большое спасибо

Чезаре


person Cesare    schedule 29.09.2014    source источник
comment
Какие ошибки вы получаете при запуске в других механизмах XSLT? Что это были за двигатели?   -  person polkovnikov.ph    schedule 30.09.2014
comment
freeformatter.com/xsl-transformer.html#ad-output – -› работает, xsltcake.com --› не работает, ошибки не отображаются, w3schools.com/xsl/ --› не работает, ошибки нет показано, xslttest.appspot.com --› это работает ..... Вы можете попробовать скопировать мой XML сообщение и преобразование XSLT... Спасибо!   -  person Cesare    schedule 30.09.2014


Ответы (1)


xsltcake.com позволяет запускать XSLT с разными движками. Если бы вы выбрали движок .NET XSLT, вы получили бы следующую ошибку

Ожидаемый конец выражения, найдено ','. System.Xml.Xsl.XslTransformException

Единственное место, где это может принадлежать, это следующий XPath

$ns1[not(.=$ns2)],$ns2[not(.=$ns1)]

и это, конечно, не разрешено в XSLT 1.0. Кажется, ты имеешь в виду

$ns1[not(.=$ns2)]

И в этом случае это действительно работает. Живая версия: http://www.xsltcake.com/slices/3ams3F

person polkovnikov.ph    schedule 29.09.2014
comment
Вы имеете в виду, что XPath $ns1[not(.=$ns2)],$ns2[not(.=$ns1)] относится к XSLT 2.0? В любом случае, я видел, что ваша живая версия работает на xsltcake.com .... Спасибо! - person Cesare; 30.09.2014
comment
@Cesare XPath 2.0, если быть точным. (Кроме того, рассмотрите возможность принятия ответа, если он помог.) - person polkovnikov.ph; 30.09.2014
comment
Я пробовал с одним и тем же XPath $ns1[not(.=$ns2)] во всех вышеперечисленных движках, и теперь он работает везде. - person Cesare; 30.09.2014