如何在wso2esb中使用xslt更改消息

时间:2014-02-03 10:28:46

标签: xslt xpath wso2esb

我希望将xml更改为欲望格式。 为此我使用xslt和我的请求xml就像这样

REQUEST

 <?xml version="1.0" encoding="UTF-8" ?>
    <usersCollection xmlns="http://ws.wso2.org/dataservice">
        <users>
            <username>1</username>
            <password>2</password>
        </users>
        <users>
            <username>faisal</username>
            <password>sps123</password>
        </users>
        <users>
            <username>youtility</username>
            <password>sps123</password>
        </users>
        <users>
            <username>yout</username>
            <password>sp3</password>
        </users>
</usersCollection>

我希望的格式看起来像这样

RESPONSE

<ns:getResponse xmlns:ns="http://ws.wso2.org/dataservice">
   <ns:user>
      <ns:myname>1</ns:myname>
      <ns:pwd>2</ns:pwd>
   </ns:user>
   <ns:user>
      <ns:myname>faisal</ns:myname>
      <ns:pwd>sps123</ns:pwd>
   </ns:user>
   <ns:user>
      <ns:myname>youtility</ns:myname>
      <ns:pwd>sps123</ns:pwd>
   </ns:user>
   <ns:user>
      <ns:myname>yout</ns:myname>
      <ns:pwd>sp3</ns:pwd>
   </ns:user>
</ns:getResponse>

我为此写了xslt,如下所示

 <xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
                xmlns:ns="http://ws.wso2.org/dataservice"
                exclude-result-prefixes="ns fn">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/">
        <xsl:apply-templates select="//ns:usersCollection"/>
    </xsl:template>

    <xsl:template match="//ns:usersCollection">
      <ns:getResponse  xmlns:ns="http://ws.wso2.org/dataservice">
        <xsl:for-each select="//ns:usersCollection/ns:users">  
          <ns:user>
            <ns:myname>
              <xsl:value-of select="//ns:usersCollection/ns:users/ns:username/."/>
            </ns:myname>
            <ns:pwd>
               <xsl:value-of select="//ns:usersCollection/ns:users/ns:password/."/>
            </ns:pwd>
          </ns:user>
        </xsl:for-each> 
       </ns:getResponse>
    </xsl:template>
</xsl:stylesheet>

但它没有给出我想要的格式,我认为我错误地选择了xpath元素我将如何为此添加单个元素 我得到这样的结果

<ns:getResponse xmlns:ns="http://ws.wso2.org/dataservice">
   <ns:user>
      <ns:myname>1 faisal youtility yout</ns:myname>
      <ns:pwd>2 sps123 sps123 sp3</ns:pwd>
   </ns:user>
   <ns:user>
      <ns:myname>1 faisal youtility yout</ns:myname>
      <ns:pwd>2 sps123 sps123 sp3</ns:pwd>
   </ns:user>
   <ns:user>
      <ns:myname>1 faisal youtility yout</ns:myname>
      <ns:pwd>2 sps123 sps123 sp3</ns:pwd>
   </ns:user>
   <ns:user>
      <ns:myname>1 faisal youtility yout</ns:myname>
      <ns:pwd>2 sps123 sps123 sp3</ns:pwd>
   </ns:user>
</ns:getResponse>

事先感谢我如何按照我的愿望格式获得

1 个答案:

答案 0 :(得分:0)

使用更多单独的模板来匹配各个元素。在您的情况下,无需使用xsl:for-each

<强>样式表

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:ns="http://ws.wso2.org/dataservice">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/ns:usersCollection">
       <ns:getResponse>
         <xsl:apply-templates/>
       </ns:getResponse>
   </xsl:template>

   <xsl:template match="ns:users">
      <ns:user>
         <xsl:apply-templates/>
      </ns:user>
   </xsl:template>

   <xsl:template match="ns:username">
      <ns:myname>
         <xsl:apply-templates/>
      </ns:myname>
   </xsl:template>

   <xsl:template match="ns:password">
      <ns:pwd>
         <xsl:apply-templates/>
      </ns:pwd>
   </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<ns:getResponse xmlns:ns="http://ws.wso2.org/dataservice">
        <ns:user>
            <ns:myname>1</ns:myname>
            <ns:pwd>2</ns:pwd>
        </ns:user>
        <ns:user>
            <ns:myname>faisal</ns:myname>
            <ns:pwd>sps123</ns:pwd>
        </ns:user>
        <ns:user>
            <ns:myname>youtility</ns:myname>
            <ns:pwd>sps123</ns:pwd>
        </ns:user>
        <ns:user>
            <ns:myname>yout</ns:myname>
            <ns:pwd>sp3</ns:pwd>
        </ns:user>
</ns:getResponse>

为什么您的方法不起作用

实际上,你并不遥远。您的方法的问题是您以不正确的方式使用//。像这样的表达式:

<xsl:value-of select="//ns:usersCollection/ns:users/ns:username/."/>

在输入XML文档中选择所有 ns:username元素,而不仅仅是此时关注的一个用户名。