XPath的。根据其他相关节点选择节点

时间:2009-12-23 16:00:46

标签: select xpath

我有一个包含两组相关值的xml:

<Rows>
    <!-- first group -->
    <Row>
        <Sequence>100</Sequence>
        <Value>+</Value>
    </Row>
    <Row>
        <Sequence>105</Sequence>
        <Value>+</Value>
    </Row>    
    <Row>
        <Sequence>110</Sequence>
        <Value>-</Value>
    </Row>
    <!-- second group -->
    <Row>
        <Sequence>150</Sequence>
        <Value>20</Value>
    </Row>
    <Row>
        <Sequence>155</Sequence>
        <Value>15</Value>
    </Row>    
    <Row>
        <Sequence>160</Sequence>
        <Value>90</Value>
    </Row>    
</Rows>

第一组的每个元素与第二组的元素相关:序列 - &gt;序列+ 50

我需要从第二组获得一组节点,第一组中的相关节点包含+符号(序列为150和155的节点)。

将来需要这些节点进行排序和枚举。

/Rows/Row[contains(/Rows/Row[Sequence = (./Sequence - 50)]/Value, '+')]

我尝试了上面的xpath,但是失败,因为./被引用到当前上下文(在第二个括号内),但是我需要访问父文件(在第一个括号内)。

有人知道解决方案吗?

问候,艾金

P.S。 substring(./ Sequence - 50,1,3)用于获取

2 个答案:

答案 0 :(得分:1)

XPath / XSLT中的上下文节点(.)和当前节点(current())之间存在区别。另见相关问题:

  

<强> Current node vs. Context node in XSLT/XPath?

在您的示例中,您需要使用current()来引用当前节点,例如

<?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="Row">
    <Row1>
      <xsl:copy-of select="."/>
    </Row1>
    <Row2>
      <xsl:copy-of select="/Rows/Row[./Sequence = (current()/Sequence + 50) and current()/Value = '+']"/>
    </Row2>
  </xsl:template>
</xsl:stylesheet>

上面的简短XSLT片段会将每行与第二组中的相应行复制到输出文档中,条件是您在问题中给出的条件(差值为50,第一行的值为+)。

答案 1 :(得分:1)

只需将查询颠倒过来:

/Rows/Row[/Rows/Row[contains(Value, '+')]/Sequence = Sequence - 50]

值得注意的是,xsl:key可能有助于加快速度。