我需要按下面的xml排序 / parentList / employeesList / personalInfo /中间名
使用XSLT。我无法生成我期待的格式。中间名称" John"应该出现在输出xml中。你能帮助我吗?以下是我的XML和XSL的
XML:
<parentList>
<employeesList>
<personalInfo>
<middleName>Mike</middleName>
<lastName>S</lastName>
</personalInfo>
<mailingAddress>
<postalCode>12345</postalCode>
<cityName>CoEmployee CityName</cityName>
<state>PA</state>
<addressLineText>CoEmployee Full Address</addressLineText>
</mailingAddress>
</employeesList>
<employeesList>
<personalInfo>
<middleName>John</middleName>
<lastName>G</lastName>
</personalInfo>
<mailingAddress>
<postalCode>12345</postalCode>
<cityName>CoEmployee CityName</cityName>
<state>PA</state>
<addressLineText>CoEmployee Full Address</addressLineText>
</mailingAddress>
</employeesList>
</parentList>
XSL:
<xsl:template match="parentList">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="/employeesList/personalInfo/middleName" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
答案 0 :(得分:1)
您需要将排序放在for-each:
中<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="parentList">
<xsl:for-each select="employeesList">
<xsl:sort select="personalInfo/middleName" order="ascending"/>
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
问题出在您在select
属性中使用的XPath表达式中。它是一个绝对表达式(以/
开头),但你的根元素不是employeesList
。
当您匹配parentList
时,您会将模板应用于其子项,这些子项为sort
元素提供上下文。这意味着select
sort
属性中的相对XPath表达式应位于employeesList
的上下文中。
如果您只是将模板更改为此内容,则应该有效:
<xsl:template match="parentList">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="personalInfo/middleName" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>