xsl-list
[Top] [All Lists]

Re: [xsl] Find First Descendants That Match Predicate?

2018-12-24 15:31:53
given

<root>
  <chapter><title>C1</title>
  <wrapper>
    <wrapper>
        <section><title>S1</title></section>
    </wrapper>
    <section><title>S2</title>
      <section><title>S3</title>
      </section>
    </section>
  </wrapper>
  </chapter>
</root>


(I moved /chapter to the end?)

and

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>


 <xsl:template match="chapter">

 <xsl:message select="
let $here:=. return
.//section[empty(ancestor::*[title] except
$here/ancestor-or-self::*[title])]/title
"/>

 </xsl:template>

</xsl:stylesheet>


the xpath in the message produces

<title>S1</title><title>S2</title>

David

On Mon, 24 Dec 2018 at 21:13, Graydon graydon(_at_)marost(_dot_)ca
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

On Mon, Dec 24, 2018 at 08:57:40PM -0000, Eliot Kimber 
ekimber(_at_)contrext(_dot_)com scripsit:
Using XPath 3:
[snip]
Given a starting node, e.g., the root node (but could be any node in the 
hierarchy) I need to find the first titled "child" nodes, so given the 
chapter node  I need to find S1 and S2 but not S3.

If you meant:

<root>
    <chapter><title>C1</title>
    <wrapper>
        <wrapper>
            <section><title>S1</title>
            </section>
        </wrapper>
        <section><title>S2</title>
            <section><title>S3</title>
            </section>
        </section>
    </wrapper>
    </chapter>
</root>

then
//descendant::*[self::section][title][not(ancestor::*[self::section][title])]

will give you the first titled element of the type you're looking for.

You'll need to put the actual values for "foo" and "bar" in where there's a 
predicate for [self::section]; [self:foo or self::bar]

-- Graydon

--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>