質問

私はこのような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>

注意してください:

  1. IDルール 使用されている すべてのノード「AS-IS」をコピーするには。

  2. アイデンティティテンプレートをオーバーライドする特定のテンプレートは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() &lt; 3]">
  ...
</xsl:for-each>

これは機能する可能性があります <template select=.... あまりにもわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top