所有
我有以下格式的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">
<a1>
<xsl:copy>
<xsl:value-of select="@id"/>
</xsl:copy>
</a1>
</xsl:template>
<xsl:template match="a1[position()<2]"></xsl:template>
</xsl:stylesheet>
但我得到的输出是
<a1> 2 </a1>
<a1> 3 </a1>
<a1> 4 </a1>
<a1> 5 </a1>
答案 0 :(得分:0)
在处理fn:position()
<a>
fn:position():返回当前正在处理的节点的索引位置
示例:// book [position()&lt; = 3]结果:选择前三本书 元素
答案 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()<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>