1

我有一个这样的 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
感谢您的帮助

4

3 回答 3

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>

与参数化相同(请记住,您不能在 XSLT 1.0 模式中使用参数引用):

<xsl:param name="pTop" select="3"/>    

<xsl:template match="employee">    
   <xsl:if test="$pTop >= position()">    
   ...
   </xsl:if>
</xsl:template>
于 2010-12-01T00:04:00.727 回答
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>

请注意

  1. 身份规则用于“按原样”复制每个节点

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

于 2010-12-01T02:29:15.637 回答
0

试试这个:

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

这也可能适用,<template select=....但我不确定。

于 2010-11-30T23:53:49.347 回答