我有一个包含两组相关值的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)用于获取
答案 0 :(得分:1)
XPath / XSLT中的上下文节点(.
)和当前节点(current()
)之间存在区别。另见相关问题:
在您的示例中,您需要使用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
可能有助于加快速度。