我有以下XML ..我想得到'步骤'来自当前'步骤的节点节点到上一步的节点,其中包含值为' DoubleClick'。
的节点事件
<?xml version="1.0" encoding="utf-8"?>
<gps>
<step>
<event>DoubleClick</event>
</step>
<step>
<event>click</event>
</step>
<step>
<event>click</event>
</step>
<step>
<event>click</event>
</step>
<step>
<event>DoubleClick</event>
</step>
<step>
<event>click</event>
</step>
<step>
<event>click</event>
</step>
<step>
<event>click</event>
</step>
<step>
<event>DoubleClick</event>
</step>
</gps>
&#13;
答案 0 :(得分:1)
有几种方法可以实现这一目标,其中之一是:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/gps">
<xsl:copy>
<xsl:for-each select="step">
<xsl:copy>
<xsl:attribute name="x">
<xsl:value-of select="position() - count(preceding-sibling::step[event='DoubleClick'][1]/preceding-sibling::step)" />
</xsl:attribute>
<xsl:copy-of select="event" />
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
请注意,虽然易于实现,但它有点CPU密集型。对于大量步骤,您可能更喜欢以下内容:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="event">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<x>
<xsl:number from="step[event='DoubleClick']" level="any" />
</x>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
当前节点为step
时,您可以使用以下xpath:
count(preceding-sibling::step[generate-id(preceding-sibling::step[event = 'DoubleClick'][1]) = generate-id(current()/preceding-sibling::step[event = 'DoubleClick'][1])])
修改强>
如果您想使用 DoubleClick 计算step
,请使用此xpath:
count(preceding-sibling::step[event = 'DoubleClick'][1]) * (count(preceding-sibling::step[generate-id(preceding-sibling::step[event = 'DoubleClick'][1]) = generate-id(current()/preceding-sibling::step[event = 'DoubleClick'][1])]) + 1)