p2p.wrox.com Forums

p2p.wrox.com Forums (http://p2p.wrox.com/index.php)
-   XSLT (http://p2p.wrox.com/forumdisplay.php?f=86)
-   -   nonempty check for an element at the same level (http://p2p.wrox.com/showthread.php?t=100345)

msambasiva@gmail.com August 22nd, 2019 02:52 AM

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.

Martin Honnen August 22nd, 2019 06:07 AM

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

msambasiva@gmail.com August 23rd, 2019 02:27 AM

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


All times are GMT -4. The time now is 03:59 AM.

Powered by vBulletin®
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
© 2013 John Wiley & Sons, Inc.