Variables XSLT:增量变量和参数赋值
嗨 我需要下面的xmlVariables XSLT:增量变量和参数赋值,variables,xslt,Variables,Xslt,嗨 我需要下面的xml <Data> <Employees> <Employee> <EmployeeName>Ram</EmployeeName> <EmployeeID>123</EmployeeID> <Gender>M</Gender> </Employee>
<Data>
<Employees>
<Employee>
<EmployeeName>Ram</EmployeeName>
<EmployeeID>123</EmployeeID>
<Gender>M</Gender>
</Employee>
<Employee>
<EmployeeName>Helen</EmployeeName>
<EmployeeID>432</EmployeeID>
<Gender>F</Gender>
</Employee>
<Employee>
<EmployeeName>Dinesh</EmployeeName>
<EmployeeID>321</EmployeeID>
<Gender>M</Gender>
</Employee>
</Employees>
</Data>
内存
123
M
海伦
432
F
迪内希
321
M
转换到这个
<?xml version="1.0" encoding="UTF-8"?>
<Employees>
<Employee Gender="Male" Current="true" index="1">
<Name>Ram</Name>
</Employee>
<Employee Gender="Male" Current="false" index="2">
<Name>Dinesh</Name>
</Employee>
<Employee Gender="Female" Current="false" index="3">
<Name>Helen</Name>
</Employee>
</Employees>
内存
迪内希
海伦
我使用的样式表如下所示
<?xml version="1.0" encoding="UTF-8"?>
<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="Data">
<Employees>
<xsl:for-each select="Employees/Employee[Gender = 'M']">
<Employee Gender="Male">
<Name>
<xsl:value-of select="EmployeeName"/>
</Name>
</Employee>
</xsl:for-each>
<xsl:for-each select="Employees/Employee[Gender = 'F']">
<Employee Gender="Female">
<Name>
<xsl:value-of select="EmployeeName"/>
</Name>
</Employee>
</xsl:for-each>
</Employees>
</xsl:template>
</xsl:stylesheet>
我尝试使用了几个示例,例如,但似乎没有任何结果。有人能帮我吗?这只是我用来解释这个问题的一个示例代码
或者更具体地说,
“当前”只需要在第一个员工节点中设置。另一方面,索引应该在所有节点上。我会为每个节点使用一个
(或者更可能是应用模板,但我会遵循您当前的结构),这样您就可以使用position()
生成索引。为了将所有的男性员工排在女性员工之后,只需将每个的按性别的降序排列就足够了(因为字母表中的“M”晚于“F”):
真的
假的
我会为每一个使用一个(或者更可能是应用模板
,但我会遵循您当前的结构),这样您就可以使用position()
生成索引。为了将所有的男性员工排在女性员工之后,只需将每个的按性别的降序排列就足够了(因为字母表中的“M”晚于“F”):
真的
假的
我会为每一个使用一个(或者更可能是应用模板
,但我会遵循您当前的结构),这样您就可以使用position()
生成索引。为了将所有的男性员工排在女性员工之后,只需将每个的按性别的降序排列就足够了(因为字母表中的“M”晚于“F”):
真的
假的
我会为每一个使用一个(或者更可能是应用模板
,但我会遵循您当前的结构),这样您就可以使用position()
生成索引。为了将所有的男性员工排在女性员工之后,只需将每个的按性别的降序排列就足够了(因为字母表中的“M”晚于“F”):
真的
假的
您可以使用位置()
确定元素在其父元素下的位置。我还倾向于重构模板,以支持apply templates
,并消除重复的男性和女性员工映射
<?xml version="1.0" encoding="UTF-8"?>
<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="Data">
<Employees>
<xsl:apply-templates select="Employees/Employee">
<xsl:sort select="Gender" order="descending" />
</xsl:apply-templates>
</Employees>
</xsl:template>
<xsl:template match="Employee">
<xsl:variable name="gender">
<xsl:choose>
<xsl:when test="Gender='M'">Male</xsl:when>
<xsl:when test="Gender='F'">Female</xsl:when>
<xsl:otherwise>Unknown</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="current">
<xsl:choose>
<xsl:when test="position() = 1">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<Employee Gender="{$gender}" Current="{$current}" index="{position()}">
<Name>
<xsl:value-of select="EmployeeName"/>
</Name>
</Employee>
</xsl:template>
</xsl:stylesheet>
男性
女性
不为人知
真的
假的
按照@Ians解决方案进行编辑,我添加了排序和Current
属性。但是,我不确定复杂的是什么-也许我错过了其他东西?您可以使用position()
确定元素在其父元素下的位置。我还倾向于重构模板,以支持apply templates
,并消除重复的男性和女性员工映射
<?xml version="1.0" encoding="UTF-8"?>
<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="Data">
<Employees>
<xsl:apply-templates select="Employees/Employee">
<xsl:sort select="Gender" order="descending" />
</xsl:apply-templates>
</Employees>
</xsl:template>
<xsl:template match="Employee">
<xsl:variable name="gender">
<xsl:choose>
<xsl:when test="Gender='M'">Male</xsl:when>
<xsl:when test="Gender='F'">Female</xsl:when>
<xsl:otherwise>Unknown</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="current">
<xsl:choose>
<xsl:when test="position() = 1">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<Employee Gender="{$gender}" Current="{$current}" index="{position()}">
<Name>
<xsl:value-of select="EmployeeName"/>
</Name>
</Employee>
</xsl:template>
</xsl:stylesheet>
男性
女性
不为人知
真的
假的
按照@Ians解决方案进行编辑,我添加了排序和Current
属性。但是,我不确定复杂的是什么-也许我错过了其他东西?您可以使用position()
确定元素在其父元素下的位置。我还倾向于重构模板,以支持