質問
私はこのようなXMLを持っています:
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
<employee name="karl"/>
<employee name="tom"/>
<employee name="jim"/>
<employee name="sandy"/>
</company>
最初のnノードのみを選択するためにXSLTテンプレートを使用するにはどうすればよいですか。たとえば、次のように取得できます。
<company>
<employee name="john"/>
<employee name="sarah"/>
<employee name="kim"/>
</company>
酸素XMLエディターでは、次のXPathを使用してそれを実現できます。
/company/employee[position() < (last() - count(/company/employee)+4)]
しかし、この場合は本当にXSLTを使用する必要があります
ご協力いただきありがとうございます
解決
最初のnノードのみを選択するためにXSLTテンプレートを使用するにはどうすればよいですか。たとえば、次のように取得できます。
<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>
注意してください:
IDルール 使用されている すべてのノード「AS-IS」をコピーするには。
アイデンティティテンプレートをオーバーライドする特定のテンプレートは1つだけです. 。それはすべてに一致します
employee
3を超えるノードリストに位置する要素は、このテンプレートには空のボディがあり、一致した要素を効果的に破棄します。
他のヒント
次の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>
これを試して:
<xsl:for-each select="company/employee[position() < 3]">
...
</xsl:for-each>
これは機能する可能性があります <template select=....
あまりにもわかりません。
所属していません StackOverflow