需要XML帮助

时间:2013-09-17 19:58:06

标签: xml xslt

所有

我有以下格式的XML

 <a>
<a1 id="1"/>
<a1 id="2"/>
<a1 id="3"/>
<a1 id="4"/>
<a1 id="5"/>
</a>

现在,使用XSLT我想删除前2个节点(根据它们的位置)并再次生成XML。所以上面的输出应该遵循XML:

<a>

    <a1 id="3"/>
    <a1 id="4"/>
    <a1 id="5"/>
    </a>

我使用过的代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />
  <xsl:template match="a1">
  &lt;a1&gt;
    <xsl:copy>
      <xsl:value-of select="@id"/>

    </xsl:copy>
&lt;/a1&gt;
  </xsl:template>
  <xsl:template match="a1[position()&lt;2]"></xsl:template>
</xsl:stylesheet>

但我得到的输出是

<a1> 2 </a1>
  <a1> 3 </a1>
  <a1> 4 </a1>
  <a1> 5 </a1>

2 个答案:

答案 0 :(得分:0)

在处理fn:position()

的子元素时,您需要使用<a>
  

fn:position():返回当前正在处理的节点的索引位置

     

示例:// book [position()&lt; = 3]结果:选择前三本书   元素

http://www.w3schools.com/xpath/xpath_functions.asp

答案 1 :(得分:0)

您可以使用称为身份模板的内容来轻松完成此操作。那将是我的例子中的第一个模板。所有这一切都是处理每个属性和节点。之后,您只需使用空白模板处理位置小于3的任何a1节点。

所以使用这个XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="a1[position()&lt;3]" />

</xsl:stylesheet>

在此XML上

<a>
  <a1 id="1"/>
  <a1 id="2"/>
  <a1 id="3"/>
  <a1 id="4"/>
  <a1 id="5"/>
</a>

生成此输出

<a>


  <a1 id="3"/>
  <a1 id="4"/>
  <a1 id="5"/>
</a>