通过独立于处理器状态排除重复节点来应用编号



关于我的在使用xsl:number时排除重复的节点主题,我得到以下代码:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="exsl msxml"
version="1.0">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:key name="car" match="car" use="concat(., '|', ../@name)" />
<xsl:template match="/cars">
<xsl:variable name="temp">
<xsl:for-each select="manufacturer">
<manufacturer name="{@name}">
<!-- copy only distinct values -->
<xsl:copy-of select="car[count(. | key('car', concat(., '|', ../@name))[1]) = 1]"/>
</manufacturer>
</xsl:for-each>
</xsl:variable>

<!-- output -->
<xsl:choose>
<xsl:when test="function-available('exsl:node-set')">
<xsl:for-each select="exsl:node-set($temp)/manufacturer">
<xsl:text> Table_</xsl:text>
<xsl:number count="manufacturer" format="A. ("/>
<xsl:value-of select="@name"/>
<xsl:text>)&#xA;</xsl:text>
<xsl:for-each select="car">
<xsl:number count="car" level="any" format="  1. "/>
<xsl:value-of select="."/>
<xsl:text>&#xA;</xsl:text>
</xsl:for-each> 
</xsl:for-each> 
</xsl:when> 
<xsl:when test="function-available('msxml:node-set')">  
<xsl:for-each select="msxml:node-set($temp)/manufacturer">
<xsl:text> Table_</xsl:text>
<xsl:number count="manufacturer" format="A. ("/>
<xsl:value-of select="@name"/>
<xsl:text>)&#xA;</xsl:text>
<xsl:for-each select="car">
<xsl:number count="car" level="any" format="  1. "/>
<xsl:value-of select="."/>
<xsl:text>&#xA;</xsl:text>
</xsl:for-each> 
</xsl:for-each> 
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

我仍然有两个问题:第一:xsl:choose中的重复是否可以消除,仍然使用for-each语法而不是apply-template?第二:我不仅仅是"exsl:node-set"one_answers"msssl:node-set"缺少有关处理器的检查?在不知道处理器状态的情况下,在三台计算机中检查了代码。此外,代码必须全局独立于程序员不知道的用户处理器。提前谢谢你。

这里有一种方法可以消除(大部分)代码重复:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
xmlns:msxml="urn:schemas-microsoft-com:xslt">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:key name="car" match="car" use="concat(., '|', ../@name)" />
<xsl:template match="/cars">
<xsl:variable name="temp">
<xsl:for-each select="manufacturer">
<manufacturer name="{@name}">
<!-- copy only distinct values -->
<xsl:copy-of select="car[count(. | key('car', concat(., '|', ../@name))[1]) = 1]"/>
</manufacturer>
</xsl:for-each>
</xsl:variable>
<!-- output -->
<xsl:choose>
<xsl:when test="function-available('exsl:node-set')">
<xsl:for-each select="exsl:node-set($temp)/manufacturer">
<xsl:call-template name="output"/>
</xsl:for-each> 
</xsl:when>    
<xsl:when test="function-available('msxml:node-set')">  
<xsl:for-each select="msxml:node-set($temp)/manufacturer">
<xsl:call-template name="output"/>
</xsl:for-each> 
</xsl:when>    
</xsl:choose>
</xsl:template>
<xsl:template name="output">
<xsl:text> Table_</xsl:text>
<xsl:number count="manufacturer" format="A. ("/>
<xsl:value-of select="@name"/>
<xsl:text>)&#xA;</xsl:text>
<xsl:for-each select="car">
<xsl:number count="car" level="any" format="    1. "/>
<xsl:value-of select="."/>
<xsl:text>&#xA;</xsl:text>
</xsl:for-each> 
</xsl:template>

</xsl:stylesheet>
恐怕我没有理解你的第二个问题。

最新更新