使用XSLT实现XML到XML的映射
我是XSLT新手,尝试使用XSLT将一个XML映射到另一个XML,下面是我的第一个XML使用XSLT实现XML到XML的映射,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我是XSLT新手,尝试使用XSLT将一个XML映射到另一个XML,下面是我的第一个XML <root> <record> <element name="LoginId">a</element> <element name="name">Admin Manager</element> <element name="password">12345</ele
<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>
A.
行政经理
12345
28
M
B
人力资源主管
通行证1
26
F
C
公关经理
pass2
27
M
我需要将此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>
A.
人力资源经理
管理组
12345
B
人力资源主管
管理组
通行证1
C
公关经理
管理组
pass2
我尝试使用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>
-
-
-
-
-
-
-
-
-
-
演示员工
-
-
-
管理组
-
但是这个xslt生成了以下XML输出
<?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
罗吉尼
管理组
共15个,产量相似
我可以用Java轻松地完成这项工作,但在xslt中必须做些什么?我面临的唯一问题是重复使用具有不同属性值的
标记
这方面的任何帮助都会对我有很大帮助我会这样做:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="root">
<final>
<xsl:apply-templates/>
</final>
</xsl:template>
<xsl:template match="record">
<test>
<xsl:apply-templates select="element[@name = ('LoginId', 'name')]"/>
<Groups>admingroup</Groups>
<xsl:apply-templates select="element[@name = 'password']"/>
</test>
</xsl:template>
<xsl:template match="element[@name = 'LoginId']">
<UID>
<xsl:value-of select="."/>
</UID>
</xsl:template>
<xsl:template match="element[@name = 'name']">
<Name>
<xsl:value-of select="."/>
</Name>
</xsl:template>
<xsl:template match="element[@name = 'password']">
<Password>
<xsl:value-of select="."/>
</Password>
</xsl:template>
</xsl:stylesheet>
管理组
通过这种方式,Saxon 9.3从示例输入生成以下结果:
<final>
<test>
<UID>a</UID>
<Name>Admin Manager</Name>
<Groups>admingroup</Groups>
<Password>12345</Password>
</test>
<test>
<UID>b</UID>
<Name>HR exec</Name>
<Groups>admingroup</Groups>
<Password>pass1</Password>
</test>
<test>
<UID>c</UID>
<Name>PR Manager</Name>
<Groups>admingroup</Groups>
<Password>pass2</Password>
</test>
</final>
A.
行政经理
管理组
12345
B
人力资源主管
管理组
通行证1
C
公关经理
管理组
pass2
即使你已经有了@Martin的答案(+1)所提出的优秀解决方案,我也在这里修正你的转换,向你展示你错在哪里。这可能有助于您进一步了解XSLT(和XPath)的工作原理
使用源架构到具有转换映射的目标架构。为了表示数据,XSLT更适合将XML转换为其他格式
签出BizTalk不客气。确保接受最适合你问题的答案。
<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: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>