1

任务:

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

  • 出现在下一个<pic>元素之前,并且
  • 包含字符串'blah'

假设:

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

这是 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>
...

4

1 回答 1

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-->
于 2013-08-23T04:31:38.167 回答