我有一个像这样的xml:
<persons>
<person name="a">
</person>
<person name="f">
</person>
<person name="b">
</person>
<person name="g">
</person>
</persons>
假设我希望所有节点位于名称为“f”的节点和名称为“g”的节点之间 因此,使用xslt解析它,它应该产生:
<person name="b">
</person>
我该怎么做?
感谢任何帮助,谢谢!
答案 0 :(得分:3)
在一个简单的列表(不是组)中,这个XPath 1.0表达式:
/persons/person[preceding-sibling::person[@name='f']]
[following-sibling::person[@name='g']]
如果有组,则此XPath 1.0表达式:
/persons
/person
[count(.|preceding-sibling::person[@name='f'][1]
/following-sibling::person[@name='g'][1]
/preceding-sibling::*) =
count(preceding-sibling::person[@name='f'][1]
/following-sibling::person[@name='g'][1]
/preceding-sibling::*)]
在XPath 2.0中,您可以使用两种情况:
/persons/person[preceding-sibling::person[@name='f'][1]
/following-sibling::person[@name='g'][1] >> .]
在XSLT 1.0中,您可以使用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kPersonByMarks" match="person"
use="concat(generate-id(
preceding-sibling::person[@name='f'][1]),
'+',
generate-id(
following-sibling::person[@name='g'][1]))"/>
<xsl:template match="person[@name='f']">
<xsl:copy-of select="key('kPersonByMarks',
concat(generate-id(),'+',
generate-id(
following-sibling::person
[@name='g'][1])))"/>
</xsl:template>
</xsl:stylesheet>
输出:
<person name="b"></person>
编辑:更正XPath 1.0和XPath 2.0的“包含”表达式
答案 1 :(得分:0)
我会使用position()函数来选择位置大于下限位置且小于上限位置的节点。
答案 2 :(得分:0)
<xsl:apply-templates
match="persons/person[not(../preceding-sibling::person[f])]"/>