有谁知道如何仅复制 xml 文件中的前 n 个节点并使用 xslt 删除其余节点?所以说我只想复制前 10 个节点并删除属于同一父节点的其余节点。
问问题
3221 次
4 回答
3
将以下模板添加到身份转换:
<xsl:template match="/*/*[position() < 11]"/>
它是如何工作的:身份转换将它匹配的任何节点递归地复制到结果文档中。但是身份转换的匹配标准具有最低的优先级;如果一个节点与任何具有更高优先级的模板匹配,则将使用该模板。(优先级规则晦涩难懂,但它们设计得非常好,您很少需要了解它们;一般来说,如果一个节点与两个模板匹配,XSLT 将选择模式更具体的模板。)
在这种情况下,我们说如果一个节点是顶级元素的子元素(顶级元素是根下的第一个元素, or /*
,因此它的子元素是/*/*
)及其在该节点列表为 11 或更高,不应复制。
编辑:
钱币。除了最重要的事情之外,以上所有内容都是正确的。我写的将复制顶级元素的每个子元素,除了前十个。
这是您需要的模板的完整(和正确)版本:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*[position() > 10]"/>
而已。第一个模板复制与第二个模板不匹配的所有内容。第二个模板匹配前 10 个之后的所有元素并且对它们不做任何事情,因此它们不会被复制到输出中。
于 2009-12-03T18:26:26.980 回答
3
您应该将它们从结果集中删除,如下所示:
<!-- note you must to encode 'greater than' and 'lower than' characters -->
<xsl:for-each select="parent/nodes[position() <= 10]">
...
</xsl:for-each>
于 2009-12-02T10:07:43.903 回答
1
抱歉,下面的代码没有正确粘贴。应该是这样的:
<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>
于 2009-12-04T00:44:31.380 回答
0
使用恒等变换,它将源树复制到输出树,并添加一个模板来排除要消除的元素。然后,由于您不想消除所有这些,而只想消除前十个之后的那些,因此根据它们的位置为允许通过的特殊模板添加一个最终模板:
<?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>
于 2009-12-02T16:35:20.070 回答