我希望将xml更改为欲望格式。 为此我使用xslt和我的请求xml就像这样
<?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>
我希望的格式看起来像这样
<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>
事先感谢我如何按照我的愿望格式获得
答案 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
元素,而不仅仅是此时关注的一个用户名。