xsl代码从xml获取一系列节点

时间:2010-12-13 16:25:17

标签: xml xslt

我有一个像这样的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>

我该怎么做?

感谢任何帮助,谢谢!

3 个答案:

答案 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])]"/>