Xpath:如何找到符合另一个元素之前的某些条件的元素

时间:2013-08-23 00:02:08

标签: xslt xpath

任务:

上下文节点是任何<pic>元素(我的处理在其中) 一个match="pic"模板),如何返回符合以下两个条件的第一个<a>元素?

  • 来自下一个<pic>元素AND
  • 包含字符串'blah'

假设:

  1. <pic>元素有时是其他<pic>元素的兄弟,但是 不总是。他们也不是其他<a>元素的兄弟姐妹。
  2. <a>元素有时是其他<a>元素的兄弟,但并非总是如此。
  3. 这是XML结构:

    <document>
    <pic>
       <img>
    </pic>
    ....
    <ul>
       <li>       
          <pic>
             <img>
          </pic>
       </li>
       <li>
          <a href="someFile.html"> <!-- doesn't meet both criteria -->
       </li>       
    </ul>
    <p>
       <a href="anotherFile.html"> <!-- doesn't meet both criteria -->
    <pic>
       <img>
    </pic>
    ...
    <a href="...blah....html"> <!-- meets both criteria -->
    <pic>
       <img>
    </pic>
    ...
    <p>
       <a href="someOtherFile.html> <!-- doesn't meet both criteria -->
    <p>
    ...
    <pic>
       <img>
    </pic>
    ...
    <a href="...blah....html"> <!-- meets both criteria -->
    ...
    <pic>
       <img>
    </pic>
    ...
    

1 个答案:

答案 0 :(得分:1)

你走了:

我的Xml

<document>
    <pic title="match none"/>
    <ul/>
    <pic title="match one"/>
    <a title="one">blah</a>
    <pic title="match two"/>
    <a title="two">blah</a>
    <pic title="match none"/>
    <pic title="match three"/>
    <ul>
        <li>
            <a title="three">blah</a>
        </li>
    </ul>
    <a title="none">blah,</a>
</document>

我的XSL

  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="pic">
        <!-- current pic identity -->
        <xsl:variable name="identity" select="generate-id()"/>
        <xsl:variable name="next-a-element" select="following::a[generate-id(preceding::pic[1]) = $identity][contains(.,'blah')]"/>

        <xsl:if test="$next-a-element">
            <xsl:comment>pic <xsl:value-of select="@title"/></xsl:comment>
            <xsl:comment>a: <xsl:value-of select="@title"/></xsl:comment>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

我的结果

<!--pic match one--><!--a: match one-->

<!--pic match two--><!--a: match two-->

<!--pic match three--><!--a: match three-->