xml ファイルの最初の n ノードのみをコピーし、xslt を使用して残りを削除する方法を知っている人はいますか? 最初の 10 個のノードのみをコピーし、同じ親に属する残りのノードを削除するとします。
4 に答える
次のテンプレートをID変換に追加します。
<xsl:template match="/*/*[position() < 11]"/>
仕組み:IDトランスフォームは、一致するノードを結果ドキュメントに再帰的にコピーします。ただし、ID変換の一致基準の優先度は可能な限り低くなります。ノードが優先度の高いテンプレートと一致する場合は、代わりにそのテンプレートが使用されます。(優先順位ルールはあいまいですが、それらについて知る必要はほとんどないほどうまく設計されています。一般的に、ノードが2つのテンプレートと一致する場合、XSLTはパターンがより具体的なテンプレートを選択します。)
この場合、ノードがトップレベル要素の子である要素である場合(トップレベル要素はルートの下の最初の要素、または/*、したがってその子要素は/*/*)であり、その位置はそのノードのリストは11以上であるため、コピーしないでください。
編集:
ウーフ。最も重要なことを除いて、上記のすべてが正しいです。私が書いたものは、最初の10個を除いて、最上位の要素のすべての子をコピーします。
必要なテンプレートの完全な(そして正しい)バージョンは次のとおりです。
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*[position() > 10]"/>
それでおしまい。最初のテンプレートは、2番目のテンプレートと一致しないものをすべてコピーします。2番目のテンプレートは、最初の10以降のすべての要素と一致し、それらに対して何も行わないため、出力にコピーされません。
次のように、結果セットからそれらを削除するだけです。
<!-- note you must to encode 'greater than' and 'lower than' characters -->
<xsl:for-each select="parent/nodes[position() <= 10]">
...
</xsl:for-each>
Sorry the code didn't paste properly below. Here is what it should be:
<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>
ソース ツリーを出力ツリーにコピーする恒等変換を使用し、削除する要素を除外するテンプレートを追加します。次に、それらすべてを削除するのではなく、最初の 10 個の後にのみ削除したいので、それらの位置に基づいて、通過が許可される特別なものの最終テンプレートを 1 つ追加します。
<?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>