可以在转换时更改元素名称

时间:2014-07-25 02:57:35

标签: xml xslt

我有这个输入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的格式与我希望的格式不同。

请让我知道并提前致谢

  • 被修改

3 个答案:

答案 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>