Wrox Programmer Forums
Go Back   Wrox Programmer Forums > XML > XSLT
|
XSLT General questions and answers about XSLT. For issues strictly specific to the book XSLT 1.1 Programmers Reference, please post to that forum instead.
Welcome to the p2p.wrox.com Forums.

You are currently viewing the XSLT section of the Wrox Programmer to Programmer discussions. This is a community of software programmers and website developers including Wrox book authors and readers. New member registration was closed in 2019. New posts were shut off and the site was archived into this static format as of October 1, 2020. If you require technical support for a Wrox book please contact http://hub.wiley.com
 
Old August 22nd, 2019, 02:52 AM
Registered User
 
Join Date: Jan 2017
Posts: 9
Thanks: 3
Thanked 0 Times in 0 Posts
Default nonempty check for an element at the same level

Hi,

XSLT2.0

I am trying to find the element names and count which are nonempty at any level

Ex:

<custom-data>
<schema>XXXschema>
<object-name>YYYYY</object-name>
<short-name>YYYYY</short-name>
<object-type>TABLE</object-type>
<mls-support-model/>
<object-owner>PPPP</object-owner>
<status/>
<columns>
<columns>
<name>ID</name>
<datatype>NUMBER</datatype>
<length/>
<precision/>
<not-null>Yes</not-null>
<comments>Identifier of the aging bucket.</comments>
<flexfield-mapping/>
<status/>
</columns>
<columns>
<name>LAST_UPDATED_BY</name>
<datatype>VARCHAR2</datatype>
<length>64</length>
<precision/>
<not-null>Yes</not-null>
<comments>Who column: indicates the user who last updated the row.</comments>
<flexfield-mapping/>
<status/>
</columns>
<columns>
<name>ATTRIBUTE8</name>
<datatype>VARCHAR2</datatype>
<length>150</length>
<precision/>
<not-null/>
<comments>Descriptive Flexfield: segment of the user descriptive flexfield.</comments>
<flexfield-mapping>Aging </flexfield-mapping>
<status/>
</columns>
</columns>
</custom-data>

I want to generate a table from the above data. The trick is, if there is no data for a column at any where, we need to exclude that column from the output table.

Ex: status,precision elements is empty for all the columns. SO we don't need to display status and precision column in output table.

How to get the number of elements without data at the same level and there names?

Thanks,

Samba.
 
Old August 22nd, 2019, 06:07 AM
Friend of Wrox
 
Join Date: Nov 2007
Posts: 1,243
Thanks: 0
Thanked 245 Times in 244 Posts
Default

It seems like grouping by name and then checking if there is at least one non-empty element in the group is a way to establish the columns you want to output:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	exclude-result-prefixes="#all"
	version="3.0">

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>.NET XSLT Fiddle Example</title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
  
  <xsl:template match="custom-data/columns">
      <xsl:variable name="columns" select="columns"/>
            
      <xsl:variable name="non-empty-cols"
        as="xs:string*">
          <xsl:for-each-group select="$columns/*" group-by="name(.)">
              <xsl:sequence
                 select="current-grouping-key()[current-group()[normalize-space()]]"/>
          </xsl:for-each-group>
      </xsl:variable>
      
      <table border="1">
          <thead>
              <tr>
                  <xsl:for-each select="$non-empty-cols">
                      <th>
                          <xsl:value-of select="."/>
                      </th>
                  </xsl:for-each>
              </tr>
          </thead>
          <tbody>
              <xsl:apply-templates select="columns">
                  <xsl:with-param name="cols" select="$non-empty-cols"/>
              </xsl:apply-templates>
          </tbody>
      </table>
  </xsl:template>
  
  <xsl:template match="columns/columns">
      <xsl:param name="cols"/>
      <tr>
          <xsl:apply-templates select="*[name() = $cols]"/>
      </tr>
  </xsl:template>

  <xsl:template match="columns/columns/*">
      <td>
          <xsl:value-of select="."/>
      </td>
  </xsl:template>

</xsl:stylesheet>
Online sample at https://xsltfiddle.liberty-development.net/pPzifqw
__________________
Martin Honnen
Microsoft MVP (XML, Data Platform Development) 2005/04 - 2013/03
My blog

Last edited by Martin Honnen; August 22nd, 2019 at 06:09 AM.. Reason: adding link to sample
The Following User Says Thank You to Martin Honnen For This Useful Post:
msambasiva@gmail.com (August 23rd, 2019)
 
Old August 23rd, 2019, 02:27 AM
Registered User
 
Join Date: Jan 2017
Posts: 9
Thanks: 3
Thanked 0 Times in 0 Posts
Default

Its working! Thank you so much for quick response!!





Similar Threads
Thread Thread Starter Forum Replies Last Post
How to copy new element at child level dishant XSLT 1 January 13th, 2012 03:24 AM
<a> element in within block-level elements? steddie1 BOOK: Beginning Web Programming with HTML, XHTML, and CSS, 2nd Edition ISBN: 978-0-470-25931-3 2 March 3rd, 2009 04:43 AM
How to detect the level of an element aliov_85 XSLT 3 April 21st, 2008 01:11 AM
Explicit Variable Check at IIS Level pvasudevan Classic ASP Basics 1 April 26th, 2004 05:07 AM
Check quantity stock level Fehrer Access VBA 17 March 29th, 2004 06:11 PM





Powered by vBulletin®
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Copyright (c) 2020 John Wiley & Sons, Inc.