如何控制xsl中元素生成的顺序

时间:2013-07-01 11:51:46

标签: xslt-1.0

我是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标准的libraray ..但是找不到一个好的替代方案..

任何建议或灵魂对我都有很大的帮助。

1 个答案:

答案 0 :(得分:0)

参考实施:

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