[英]Deleting xml nodes using xslt
有谁知道如何仅复制xml文件中的前n个节点并使用xslt删除其余节点? 可以这么说,我只想复制前10个节点并删除属于同一父节点的其余节点。
您应该将它们从结果集中删除,如下所示:
<!-- note you must to encode 'greater than' and 'lower than' characters -->
<xsl:for-each select="parent/nodes[position() <= 10]">
...
</xsl:for-each>
将以下模板添加到标识转换中:
<xsl:template match="/*/*[position() < 11]"/>
工作原理:身份转换将其匹配的任何节点递归复制到结果文档中。 但是身份转换的匹配标准具有最低的优先级; 如果某个节点被具有更高优先级的任何模板匹配,则将使用该模板。 (优先级规则晦涩难懂,但是它们的设计是如此精心,以至于您几乎不需要了解它们;通常来说,如果一个节点被两个模板匹配,则XSLT会选择模式更具体的模板。)
在这种情况下,我们要说的是,如果节点是顶级元素的子元素(顶级元素是根下的第一个元素或/*
,则其子元素就是/*/*
),并且它在该节点列表中的位置为11或更高,因此不应复制。
编辑:
钱币。 除最重要的内容外,以上所有内容都是正确的。 我写的内容将复制除前十个元素之外的所有顶级元素的子元素。
这是您需要的模板的完整(正确)版本:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*[position() > 10]"/>
而已。 第一个模板复制第二个模板不匹配的所有内容。 第二个模板匹配前10个元素之后的所有元素,并且不对其进行任何操作,因此不会将其复制到输出中。
抱歉,代码未正确粘贴到下面。 应该是这样的:
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="inner"/>
<xsl:template match="/*/*[position() < 11]">
<xsl:call-template name="identity"/>
</xsl:template>
使用标识转换,它将源树复制到输出树,并添加模板以排除要消除的元素。 然后,由于您不想删除所有模板,而只删除前十个模板之后的模板,请根据其位置为允许的特殊模板添加一个最终模板:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="inner"/>
<xsl:template match="inner[position() < 11]">
<xsl:call-template name="identity"/>
</xsl:template>
</xsl:stylesheet>
与XML一起使用
<?xml version="1.0" encoding="UTF-8"?>
<outer>
<inner foo="1"/>
<inner foo="2"/>
<inner foo="3"/>
<inner foo="4"/>
<inner foo="5"/>
<inner foo="6"/>
<inner foo="7"/>
<inner foo="8"/>
<inner foo="9"/>
<inner foo="10"/>
<inner foo="11"/>
<inner foo="12"/>
<inner foo="13"/>
<inner foo="14"/>
</outer>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.