如何计算先前的兄弟计数直到满足某些条件?

时间:2015-07-02 03:57:07

标签: xml xslt

我有以下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;
&#13;
&#13;

2 个答案:

答案 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)