title: XSL Template match and then IF condition on following-sibling
body: <p>I have the following problem. I need to know whether a condition is met on any of x number of sub-nodes of the same name and do not process the line. I'm parsing an xml to a text file but it could have 2 or 3 same sub-nodes called the same with different value and if one of them meets the condition then process the line.</p>
  
  <p>Here's part of my XML:</p>
  
  <pre><code>&lt;home&gt;
      &lt;app&gt;
          &lt;data&gt;
              &lt;rec&gt;
                  &lt;rpos&gt;1&lt;/rpos&gt;
                  &lt;itemdef&gt;
                      &lt;item&gt;HLK-TEST-A&lt;/item&gt;
                      &lt;desc&gt;SOMETHING1&lt;/desc&gt;
                      &lt;ics&gt;
                          &lt;code&gt;HKU&lt;/code&gt;
                          &lt;bpid&gt;&lt;/bpid&gt;
                          &lt;citem&gt;TEST-A&lt;/citem&gt;
                      &lt;/ics&gt;  
                      &lt;ics&gt;
                          &lt;code&gt;HLK&lt;/code&gt;
                          &lt;bpid&gt;&lt;/bpid&gt;
                          &lt;citem&gt;TEST-A&lt;/citem&gt;
                      &lt;/ics&gt;
                  &lt;/itemdef&gt;
              &lt;/rec&gt;
              &lt;rec&gt;
                  &lt;rpos&gt;2&lt;/rpos&gt;
                  &lt;itemdef&gt;
                      &lt;item&gt;HLK-TEST-B&lt;/item&gt;
                      &lt;desc&gt;Test&lt;/desc&gt;
                      &lt;ics&gt;
                          &lt;code&gt;HKU&lt;/code&gt;
                          &lt;bpid&gt;&lt;/bpid&gt;
                          &lt;citem&gt;TEST-B&lt;/citem&gt;
                      &lt;/ics&gt;
                  &lt;/itemdef&gt;
              &lt;/rec&gt;
              &lt;rec&gt;
                  &lt;rpos&gt;3&lt;/rpos&gt;
                  &lt;itemdef&gt;
                      &lt;item&gt;HLK-TEST-C&lt;/item&gt;
                      &lt;desc&gt;Test3&lt;/desc&gt;
                      &lt;ics&gt;
                          &lt;code&gt;HLK&lt;/code&gt;
                          &lt;bpid&gt;&lt;/bpid&gt;
                          &lt;citem&gt;TEST-C&lt;/citem&gt;
                      &lt;/ics&gt;
                  &lt;/itemdef&gt;
              &lt;/rec&gt;
              &lt;rec&gt;
                  &lt;rpos&gt;4&lt;/rpos&gt;
                  &lt;itemdef&gt;
                      &lt;item&gt;HLK-TEST-D&lt;/item&gt;
                      &lt;desc&gt;SOMETHING4&lt;/desc&gt;
                      &lt;ics&gt;
                          &lt;code&gt;HLK&lt;/code&gt;
                          &lt;bpid&gt;&lt;/bpid&gt;
                          &lt;citem&gt;TEST-D&lt;/citem&gt;
                      &lt;/ics&gt;  
                      &lt;ics&gt;
                          &lt;code&gt;HKU&lt;/code&gt;
                          &lt;bpid&gt;&lt;/bpid&gt;
                          &lt;citem&gt;TEST-D&lt;/citem&gt;
                      &lt;/ics&gt;
                  &lt;/itemdef&gt;
              &lt;/rec&gt;
          &lt;/data&gt;
      &lt;/app&gt;
  &lt;/home&gt;
  </code></pre>
  
  <p>Basically Records 1,3 and 4 have to process because they have a "code" tag with value of HLK</p>
  
  <p>Here's what I have on my XSLT... although I can manage to get only records 1 and 3... could you help?</p>
  
  <p>XSL:</p>
  
  <pre><code>&lt;xsl:output method="text"/&gt;
  &lt;xsl:strip-space elements="*"/&gt;
  
  
  &lt;xsl:template match="home/app/data/rec[itemdef/ics[position() = last()]/code[not(starts-with(.,'HLK'))]]"&gt;
  &lt;/xsl:template&gt;
  
  &lt;xsl:template match="home"&gt;
      &lt;xsl:apply-templates select="app"/&gt;
  &lt;/xsl:template&gt;
  
      &lt;xsl:template match="app"&gt;
          &lt;xsl:apply-templates select="data"/&gt;
      &lt;/xsl:template&gt;
  
          &lt;xsl:template match="app" mode="print"&gt;
              &lt;xsl:text&gt;105604|&lt;/xsl:text&gt;
              &lt;xsl:value-of select='date'/&gt;
              &lt;xsl:text&gt;T&lt;/xsl:text&gt;
              &lt;xsl:value-of select='time'/&gt;
              &lt;xsl:text&gt;|&lt;/xsl:text&gt;
          &lt;/xsl:template&gt;
  
              &lt;xsl:template match="data"&gt;
                  &lt;xsl:apply-templates select="rec"/&gt;
              &lt;/xsl:template&gt;
  
                  &lt;xsl:template match="rec"&gt;
                      &lt;xsl:apply-templates select="itemdef"/&gt;
                  &lt;/xsl:template&gt;
  
                      &lt;xsl:template match="itemdef"&gt;
                          &lt;xsl:apply-templates select="ancestor::app" mode="print"/&gt;
                          &lt;xsl:value-of select='item'/&gt;&lt;xsl:text&gt;|&lt;/xsl:text&gt;
                          &lt;xsl:value-of select='desc'/&gt;&lt;xsl:text&gt;|&lt;/xsl:text&gt;
                                  &lt;xsl:text&gt;|&lt;/xsl:text&gt;
                                  &lt;xsl:text&gt;|&amp;#xD;&amp;#xA;&lt;/xsl:text&gt;
                      &lt;/xsl:template&gt;
  &lt;/xsl:stylesheet&gt;
  </code></pre>
  
  <p>And here's my current Output:</p>
  
  <pre><code>105604|T|HLK-TEST-A|SOMETHING1|||
  105604|T|HLK-TEST-C|Test3|||
  </code></pre>
  
  <p>But should be:</p>
  
  <pre><code>105604|T|HLK-TEST-A|SOMETHING1|||
  105604|T|HLK-TEST-C|Test3|||
  105604|T|HLK-TEST-D|SOMETHING4|||
  </code></pre>