问题
I have an xml that contains two groups of related values:
<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>
Each element of 1st group related to an element of 2nd group: sequence -> sequence + 50
I need to get a node set of nodes from 2nd group which related nodes from 1st group contain + sign (nodes with sequences 150 and 155).
These nodes are needed for future sorting and enumerating.
/Rows/Row[contains(/Rows/Row[Sequence = (./Sequence - 50)]/Value, '+')]
I tried the above xpath, but failed as ./ is referenced to the current context (within second brackets), but I need to access to the parent one (within first brackets).
Do anybody know a solution for that?
Regards, Aikin
P.S. substring(./Sequence - 50, 1, 3) is used to get
回答1:
Just turn the query upside down:
/Rows/Row[/Rows/Row[contains(Value, '+')]/Sequence = Sequence - 50]
It's also worth noting that xsl:key may be useful here to speed things up.
回答2:
There is a distinction between the context node (.) and the current node (current()) in XPath/XSLT. See also this related question:
Current node vs. Context node in XSLT/XPath?
In your example you would need to use current() to refer to the current node, e.g.
<?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>
The above short XSLT snippet will copy each row with a corresponding row from the second group to the output document with the condition you gave in your question (difference is 50 and the first row has a + value).
来源:https://stackoverflow.com/questions/1953628/xpath-select-nodes-based-on-an-other-related-node