XSLT排序printDoc节点问题:处理无type属性的printDoc时无法按预期排序
XSLT排序printDoc节点问题:处理无type属性的printDoc时无法按预期排序
看起来你遇到的问题是那些不带type属性的printDoc节点没被正确归类,导致排序不符合预期对吧?
先帮你分析下现有代码的问题:你当前用printDoc[@type!='adhoc']来筛选要先输出的非adhoc节点,但在XPath规则里,不存在的属性和任何值做比较都会返回false,所以那些没有type属性的printDoc根本不会被这个条件匹配到。结果就是这些节点既不会被第一个<xsl:apply-templates>处理,也不会被第二个针对@type='adhoc'的模板处理,自然就打乱了你想要的排序逻辑。
要解决这个问题很简单,只需要把第一个筛选条件改成printDoc[not(@type='adhoc')]就行。这个条件的意思是:所有type属性不等于adhoc,或者根本没有type属性的printDoc节点。这样就能把所有非adhoc的节点(包括无type的)按原有顺序先输出,最后再输出所有type='adhoc'的节点,完全符合你的需求。
修改后的完整XSLT代码如下:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="xml" indent="yes" /> <xsl:strip-space elements="*" /> <xsl:template match="printJob"> <xsl:copy> <!-- 先处理所有非adhoc的printDoc(包括无type属性的) --> <xsl:apply-templates select="printDoc[not(@type='adhoc')]" /> <!-- 最后处理所有adhoc类型的printDoc --> <xsl:apply-templates select="printDoc[@type='adhoc']" /> </xsl:copy> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
举个例子验证下:假设你的原始XML是这样的:
<printJob> <printDoc>无type属性</printDoc> <printDoc type="normal">普通类型</printDoc> <printDoc type="adhoc">临时类型</printDoc> <printDoc type="other">其他类型</printDoc> </printJob>
转换后的结果会是:
<printJob> <printDoc>无type属性</printDoc> <printDoc type="normal">普通类型</printDoc> <printDoc type="other">其他类型</printDoc> <printDoc type="adhoc">临时类型</printDoc> </printJob>
完全符合你“非adhoc节点保持原顺序,adhoc节点放最后”的要求。
备注:内容来源于stack exchange,提问作者Chetan Mehra
相关产品推荐
相关产品推荐

