我对XSLT很陌生。因此,我面临一些困难。我必须将一个相当大的XML转换成一个新的XML。然而,在我前进的道路上,我面临着一些困难:
输入XML可能类似于:
<Employees>
<Employee>
<Name>A</Name>
<Role>Manager</Role>
<Salary>5000$</Salary>
</Employee>
<Employee>
<Name>A</Name>
<Role>Director</Role>
<Salary>8000$</Salary>
</Employee>
</Employees>
输出的XML应该是这样的:
<Manager>
<Employee_Name>A</Employee_Name>
</Manager>
<Count_Of_Employee>2</Count_Of_Employee>
<Director>
<Employee_Name>B</Employee_Name>
</Director>
现在,如果,我将应用模板<xsl:Employees/Employee>
,那么它将检查每个员工,并在Manager标记之后创建Director标记。
因此,在针对XSD运行验证时,它将失败,因为它希望在两者之间有一个coutn标记。
所以我的第一个问题是:在编写通用模板时,如何控制输出元素节点的顺序?
我的另一个问题是:我必须转换一个大的XML,所以我不想每次生成标记时都编写<xsl:element>
。。
我试着搜索各种通用模板。。但是找不到或写不到一个好的通用模板来生成一个标记名(在目标xml中)与(在源xml中)不同的元素[我在两个xml中都找到了元素名相同的各种通用模板]。
有人能帮我吗。。我也查阅了XSL标准库。。但找不到一个好的替代方案。。
任何建议或灵魂都会对我有很大帮助。
参考实现:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!--Suppress unmatched text-->
<xsl:template match="text()" />
<xsl:template match="/">
<root>
<Manager>
<Employee_Name>
<xsl:apply-templates select="Employees/Employee[Role/. = 'Manager']"/>
</Employee_Name>
</Manager>
<Count_Of_Employee>
<xsl:value-of select="count(Employees/Employee)"/>
</Count_Of_Employee>
<Director>
<Employee_Name>
<xsl:apply-templates select="Employees/Employee[Role/. = 'Director']"/>
</Employee_Name>
</Director>
</root>
</xsl:template>
<xsl:template match="Employee">
<xsl:value-of select="Name"/>
</xsl:template>
</xsl:stylesheet>