使用XSLT复制前N个节点及其子节点



我有一个XML文档,其中包含CD目录:

<?xml version="1.0"?>
<catalog>
<cd><title>Greatest Hits 1999</title><artits>Various Artists</artist></cd>
<cd><title>Greatest Hits 2000</title></cd>
<cd><title>Best of Christmas</title></cd>
<cd><title>Foo</title></cd>
<cd><title>Bar</title></cd>
<cd><title>Baz</title></cd>
<!-- hundreds of additional <cd> nodes -->
</catalog>

我想使用XSLT1.0来创建这个XML文档的摘录,其中只包含前N个<cd>节点,以及它们的父节点和子节点。比方说N=2;这意味着我期望以下输出:

<?xml version="1.0"?>
<catalog>
<cd><title>Greatest Hits 1999</title><artits>Various Artists</artist></cd>
<cd><title>Greatest Hits 2000</title></cd>
</catalog>

我找到了这个答案,从中我调整了以下样式表:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:param name="count" select="2"/>
<!-- Copy everything, except... -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- cd nodes that have a too large index -->
<xsl:template match="cd[position() &gt;= $count]" />
</xsl:stylesheet>

当我尝试应用这个样式表时,我会得到以下错误:Forbidden variable: position() >= $count
$count替换为文字2时,输出包含完整的输入文档,其中包含数百个<cd>节点。

如何使用XSLT从我的XML文档中获得一个仍然是有效的XML,但只是抛出一堆节点的摘录?我正在寻找一个通用的ish解决方案,它也适用于不像我的示例那样简单的文档结构。

为什么不简单:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="count" select="2"/>
<xsl:template match="/catalog">
<xsl:copy>
<xsl:copy-of select="cd[position() &lt;= $count]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

如果您想使其通用(这在实践中很少起作用,因为XML文档有各种各样的结构(,请尝试以下方法:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="count" select="2"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="*[position() &lt;= $count]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新