我有这个输入XML:
<?xml version="1.0" encoding="utf-8"?>
<Document>
<File>
<Id>123</Id>
<Created>21/12/2013</Created>
</File>
<Employee>
<Personal>
<Name>Juan Dela Cruz</Name>
<Age>27</Age>
<Address>
<Street1>Street1</Street1>
<Street2>Street2</Street2>
<PostalCode>123456</PostalCode>
</Address>
</Personal>
<Employment>
<DateHired>21/12/2013</DateHired>
<Position>Clerk</Position>
<EmploymentType>Contractual</EmploymentType>
<Department>Sales</Department>
</Employment>
</Employee>
<Employee>
<Personal>
<Name>Juana Change</Name>
<Age>28</Age>
<Address>
<Street1>Street1</Street1>
<Street2>Street2</Street2>
<PostalCode>123456</PostalCode>
</Address>
</Personal>
<Employment>
<DateHired>22/12/2013</DateHired>
<Position>Manager</Position>
<EmploymentType>Full-Time</EmploymentType>
<Department>Sales</Department>
</Employment>
</Employee>
</Document>
我需要转变成这样的东西:
<Profiles>
<File>
<FileId>123</FileId>
<FileDate>21/12/2013</FileDate>
</File>
<EmployeeProfile>
<Information>
<EmpName>Juan Dela Cruz</EmpName>
<Age>27</Age>
<EmpAddress>Street1 Street2, 123456</EmpAddress>
<EmpStartDate>21/12/2013</EmpStartDate>
<EmpPosition>Clerk</EmpPosition>
<EmpType>Contractual</EmpType>
<EmpDepartment>Sales</EmpDepartment>
</Information>
</EmployeeProfile>
<EmployeeProfile>
<Information>
<EmpName>Juana Change</EmpName>
<Age>28</Age>
<EmpAddress>Street1 Street2, 123456</EmpAddress>
<EmpStartDate>22/12/2013</EmpStartDate>
<EmpPosition>Manager</EmpPosition>
<EmpType>Full-Time</EmpType>
<EmpDepartment>Sales</EmpDepartment>
</Information>
</EmployeeProfile>
</Profiles>
有没有办法使用XSLT来做到这一点,因为源XML的格式与我希望的格式不同。
请让我知道并提前致谢
答案 0 :(得分:1)
这是一个部分样式表,可以帮助您入门:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Document">
<Profiles>
<xsl:apply-templates select="*"/>
</Profiles>
</xsl:template>
<xsl:template match="File">
<File>
<FileId><xsl:value-of select="Id"/></FileId>
<FileDate><xsl:value-of select="Created"/></FileDate>
</File>
</xsl:template>
<xsl:template match="Employee">
<Information>
<EmpName><xsl:value-of select="Personal/Name"/></EmpName>
<Age><xsl:value-of select="Personal/Age"/></Age>
.
.
.
</Information>
</xsl:template>
</xsl:stylesheet>
理解这一点的关键是要了解XSL处理器的工作原理。样式表不是传统意义上的“程序”。它是一组在处理器读取XML时应用的规则。这需要一些习惯,但当你“得到”它时,XSL的美丽将变得明显。
答案 1 :(得分:0)
以下是推式样式表的示例:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<!-- This is called an identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Document">
<EmployeeProfile>
<xsl:apply-templates/>
</EmployeeProfile>
</xsl:template>
<xsl:template match="File">
<Profile>
<xsl:apply-templates/>
</Profile>
</xsl:template>
<xsl:template match="File/Id">
<ProfileId>
<xsl:apply-templates/>
</ProfileId>
</xsl:template>
<xsl:template match="File/Created">
<ProfileDate>
<xsl:apply-templates/>
</ProfileDate>
</xsl:template>
<xsl:template match="Employee">
<Information>
<xsl:apply-templates/>
</Information>
</xsl:template>
<xsl:template match="Personal|Employment">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="Personal/Name">
<EmpName>
<xsl:apply-templates/>
</EmpName>
</xsl:template>
<xsl:template match="Personal/Address">
<EmpAddress>
<xsl:for-each select="*">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
</EmpAddress>
</xsl:template>
<xsl:template match="Employment/DateHired">
<EmpStartDate>
<xsl:apply-templates/>
</EmpStartDate>
</xsl:template>
<xsl:template match="Employment/Position">
<EmpPosition>
<xsl:apply-templates/>
</EmpPosition>
</xsl:template>
<xsl:template match="Employment/EmploymentType">
<EmpType>
<xsl:apply-templates/>
</EmpType>
</xsl:template>
<xsl:template match="Employment/Department">
<EmpDepartment>
<xsl:apply-templates/>
</EmpDepartment>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
如何以简单的方式做到这一点:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<Profiles>
<File>
<FileId><xsl:value-of select="Document/File/Id"/></FileId>
<FileDate><xsl:value-of select="Document/File/Created"/></FileDate>
</File>
<xsl:for-each select="Document/Employee">
<EmployeeProfile>
<Information>
<EmpName><xsl:value-of select="Personal/Name"/></EmpName>
<Age><xsl:value-of select="Personal/Age"/></Age>
<EmpAddress>
<xsl:value-of select="Personal/Address/Street1"/>
<xsl:text> </xsl:text>
<xsl:value-of select="Personal/Address/Street2"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="Personal/Address/PostalCode"/>
</EmpAddress>
<EmpStartDate><xsl:value-of select="Employment/DateHired"/></EmpStartDate>
<EmpPosition><xsl:value-of select="Employment/Position"/></EmpPosition>
<EmpType><xsl:value-of select="Employment/EmploymentType"/></EmpType>
<EmpDepartment><xsl:value-of select="Employment/Department"/></EmpDepartment>
</Information>
</EmployeeProfile>
</xsl:for-each>
</Profiles>
</xsl:template>
</xsl:stylesheet>