2014-09-29 1 views
0

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

Я следующее сообщение 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> 

моря rching в Интернете теперь я построил этот 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 Tester в Интернете я обнаружил, что где-то работает, а где-то не работает так Я не уверен, что это может быть правильное и портативное решение.

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

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

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

Чезаре

+0

Какие ошибки вы получаете при запуске в других устройствах XSLT? Какими были эти двигатели? –

+0

http://www.freeformatter.com/xsl-transformer.html#ad-output -> работает, http://www.xsltcake.com/ -> не работает, не отображается ошибка, http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog -> не работает, не отображается ошибка, http://xslttest.appspot.com/ -> он работает ..... Вы можете попробовать скопировать мое XML-сообщение и преобразование XSLT ... Спасибо! – Cesare

ответ

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

+0

Вы имеете в виду, что XPath $ ns1 [not (. = $ Ns2)], $ ns2 [not (. = $ Ns1)] - это что-то о XSLT 2.0? В любом казино я видел, что вы живете, версия работает на xsltcake.com .... Спасибо! – Cesare

+0

@Cesare [XPath 2.0, если быть точным] (http://stackoverflow.com/questions/5355191/comma-operator-in-xpath-is-it-like-c). (Также подумайте о принятии ответа, если это помогло.) –

+0

Я пробовал с тем же XPath $ ns1 [not (. = $ Ns2)] во всех вышеперечисленных машинах и теперь кажется, что он работает повсюду – Cesare

Смежные вопросы