我有一个像这样的XML:
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
<employee name="karl"/>
<employee name="tom"/>
<employee name="jim"/>
<employee name="sandy"/>
</company>
如何使用XSLT模板仅选择前n个节点,例如3,所以我可以得到:
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
</company>
在Oxygen XML编辑器中,我可以使用以下XPath来实现:
/company/employee[position() < (last() - count(/company/employee)+4)]
但在这种情况下我真的需要使用XSLT
谢谢你的帮助
答案 0 :(得分:2)
我可以使用以下XPath 实现这一点:
/company/employee[position() < (last() - count(/company/employee)+4)]
请注意,此处last()
等于count(/company/employee)
,因此这将减少为:
/company/employee[4 > position()]
你可以拥有一种模式:
<xsl:template match="employee[4 > position()]">
...
</xsl:template>
与参数化相同(Remenber你不能在XSLT 1.0模式中使用参数引用):
<xsl:param name="pTop" select="3"/>
<xsl:template match="employee">
<xsl:if test="$pTop >= position()">
...
</xsl:if>
</xsl:template>
答案 1 :(得分:2)
如何使用XSLT模板 只选择前n个节点,3 例如,我可以得到:
<company> <employee name="john"/> <employee name="sarah"/> <employee name="kim"/> </company>
简短的回答:通过了解一点点XPath和XSLT。
完成(但仍然很短)回答:
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="employee[position() > 3]"/>
</xsl:stylesheet>
应用于提供的XML文档:
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
<employee name="karl"/>
<employee name="tom"/>
<employee name="jim"/>
<employee name="sandy"/>
</company>
生成想要的正确结果:
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
</company>
请注意:
使用identity rule “按原样”复制每个节点。
只有一个特定模板会覆盖身份模板。它匹配节点列表中大于3的位置的任何employee
元素。此模板具有空体,有效地丢弃匹配的元素。
答案 2 :(得分:0)
试试这个:
<xsl:for-each select="company/employee[position() < 3]">
...
</xsl:for-each>
这也适用于<template select=....
,但我不确定。