2010-11-30 69 views
1

我有一个是这样的XML:XSLT来分割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> 

氧XML编辑器,我可以使用下面的XPath来实现这一目标:

/company/employee[position() < (last() - count(/company/employee)+4)] 

但我真的需要在这种情况下,01使用XSLT 感谢您的帮助

+0

好问题,+1。看到我的答案是一个完整而极短的解决方案。 :) – 2010-12-01 02:30:11

回答

2

如何使用XSLT一个模板 选择只是第n个节点,3 例如,这样我就可以得到:

<company> 
    <employee name="john"/> 
    <employee name="sarah"/> 
    <employee name="kim"/> 
</company> 

简短的回答:通过KNO只是有点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> 

请注意

  1. identity rule用于到每个节点复制 “原样”。

  2. 只有一个特定模板覆盖身份模板。它匹配任何employee元素,且节点列表中的位置大于3.此模板具有空的主体,有效地丢弃匹配的元素。

0

试试这个:

<xsl:for-each select="company/employee[position() &lt; 3]"> 
    ... 
</xsl:for-each> 

这可能与<template select=....工作太多,但我不知道。

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>