我是XSLT的新手,并尝试使用xslt将一个
XML映射到另一个
XML,这是我的第一个XML
<root> <record> <element name="LoginId">a</element> <element name="name">Admin Manager</element> <element name="password">12345</element> <element name="Age">28</element> <element name="Sex">M</element> </record> <record> <element name="LoginId">b</element> <element name="name">HR exec</element> <element name="password">pass1</element> <element name="Age">26</element> <element name="Sex">F</element> </record> <record> <element name="LoginId">c</element> <element name="name">PR Manager</element> <element name="password">pass2</element> <element name="Age">27</element> <element name="Sex">M</element> </record> </root>
我需要将此XML转换为以下内容
<?xml version="1.0" encoding="UTF-8"?> <final> <test> <UID>a</UUID> <Name>HR manager</Name> <Groups>admingroup</Groups> <Password>12345</Password> </test> <test> <UID>b</UUID> <Name>HR exec</Name> <Groups>admingroup</Groups> <Password>pass1</Password> </test> <test> <UID>c</UUID> <Name>PR manager</Name> <Groups>admingroup</Groups> <Password>pass2</Password> </test> </final>
我试着跟随xslt进行转换
<?xml version="1.0" encoding="UTF-8" ?> - <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> - <xsl:template match="/"> - <test> - <xsl:for-each select="root/record"> <xsl:apply-templates select="element" /> </xsl:for-each> </test> </xsl:template> - <xsl:template match="element"> - <test> <Employee /> - <UID> <xsl:value-of select="@LoginId" /> </UID> - <xsl:choose> - <xsl:when test="@name = ''"> - <Name> <xsl:text>demo employee</xsl:text> </Name> </xsl:when> - <xsl:otherwise> - <Name> <xsl:value-of select="@name" /> </Name> </xsl:otherwise> </xsl:choose> - <Groups> <xsl:text>admingroup</xsl:text> </Groups> - <Password> <xsl:value-of select="@password" /> </Password> </test> </xsl:template> </xsl:transform>
<?xml version="1.0" encoding="UTF-8"?> <impex> <final> <Employee /> <UID /> <Name>LoginId</Name> <Groups>admingroup</Groups> <Password /> </final> total 15 <final></final> with similar output
我可以在Java中轻松完成,但有些在xslt中必须做什么,而我遇到的唯一问题是重复< element>标记具有不同的属性值
在这方面的任何帮助对我都很有帮助
即使你已经有了@Martin的答案(1)提出的优秀解决方案,我也在这里修改你的变换来向你展示你错在哪里.这可能有助于您更多地了解XSLT(和XPath)的工作原理.
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output indent="yes"/> <xsl:template match="/"> <final> <xsl:apply-templates select="root/record" /> </final> </xsl:template> <xsl:template match="record"> <test> <Employee /> <UID> <xsl:value-of select="element[@name='LoginId']" /> </UID> <xsl:choose> <xsl:when test="element[@name='name']=''"> <Name> <xsl:text>demo employee</xsl:text> </Name> </xsl:when> <xsl:otherwise> <Name> <xsl:value-of select="element[@name='name']"/> </Name> </xsl:otherwise> </xsl:choose> <Groups> <xsl:text>admingroup</xsl:text> </Groups> <Password> <xsl:value-of select="element[@name='password']" /> </Password> </test> </xsl:template> </xsl:transform>
请注意,xsl:choose方法是正确的,即使通常优选的XSLT方式是模板规则:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output indent="yes"/> <xsl:template match="/"> <final> <xsl:apply-templates select="root/record" /> </final> </xsl:template> <xsl:template match="record"> <test> <Employee /> <UID> <xsl:value-of select="element[@name='LoginId']" /> </UID> <Name> <xsl:apply-templates select="element[@name='name']"/> </Name> <Groups> <xsl:text>admingroup</xsl:text> </Groups> <Password> <xsl:value-of select="element[@name='password']" /> </Password> </test> </xsl:template> <xsl:template match="element[@name='name'][.='']"> <xsl:text>demo employee</xsl:text> </xsl:template> <xsl:template match="element[@name='name'][.!='']"> <xsl:value-of select="."/> </xsl:template> </xsl:transform>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。