Question

Excuse my ignorance. I am just beginning XSL and XML transformations.

I receive xml data from a vendor. I only need to include certain "ids" in my transformation. I also need to add a "display name" based on the ID to the final output. I would be able to manual add the ID and Display names necessary into the XSL.

XML ex.

<root>
  <DATA>
    <ID>rd_bl</ID> 
    <travel>15</travel<
    <delay>7</delay>
  </DATA>
  <DATA>
    <ID>yl_gr</ID> 
    <travel>18</travel<
    <delay>9</delay>
  </DATA>
  <DATA>
    <ID>pu_gr</ID> 
    <travel>17</travel<
    <delay>6</delay>
  </DATA>
</root>

I would like to write a list of IDs and "display names" in the xsl - only the records with the listed IDs would be included.

ID - Display Name

rd_bl - Red to Blue

pu_gr - Purple to Green

In this example the data from yl_gr would be ignored and not show up in the transformation.

Any help is greatly appreciated.

Thanks!

Was it helpful?

Solution

Here’s a simple stylesheet that checks whether an ID is within an approved list of IDs and uses a “display name” for it in the output.

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <xsl:variable name="desired-ids">
    <id name="rd_bl">Red to Blue</id>
    <id name="pu_gr">Purple to Green</id>
  </xsl:variable>

  <xsl:template match="root">
    <root>
      <xsl:apply-templates />
    </root>
  </xsl:template>

  <xsl:template match="DATA">
    <xsl:variable name="current-id" select="ID/text()" />
    <xsl:if test="$desired-ids/id[@name=$current-id]">
      <entry>
        <name>
          <xsl:value-of select="$desired-ids/id[@name=$current-id]" />
        </name>
        <travel>
          <xsl:value-of select="travel" />
        </travel>
        <delay>
          <xsl:value-of select="delay" />
        </delay>
      </entry>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

Output using your example XML after correcting the closing tag errors:

<root>
  <entry>
    <name>Red to Blue</name>
    <travel>15</travel>
    <delay>7</delay>
  </entry>
  <entry>
    <name>Purple to Green</name>
    <travel>17</travel>
    <delay>6</delay>
  </entry>
</root>

EDIT: in case you’re stuck with XSL 1.0:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:variable name="desired-ids">rd_bl="Red to Blue" pu_gr="Purple to Green"</xsl:variable>

  <xsl:template match="root">
    <root>
      <xsl:apply-templates />
    </root>
  </xsl:template>

  <xsl:template match="DATA">
    <xsl:variable name="current-id" select="ID/text()" />
    <xsl:variable name="id-with-equals" select="concat($current-id, '=')" />
    <xsl:if test="contains($desired-ids, $id-with-equals)">
      <xsl:variable name="id-with-open-quote" select="concat($id-with-equals, '&quot;')" />
      <xsl:variable name="display-name" select="substring-before(substring-after($desired-ids, $id-with-open-quote), '&quot;')" />
      <entry>
        <name>
          <xsl:value-of select="$display-name" />
        </name>
        <travel>
          <xsl:value-of select="travel" />
        </travel>
        <delay>
          <xsl:value-of select="delay" />
        </delay>
      </entry>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

You can see this is much less elegant, it uses awkward string-matching to check for a valid ID and extract the display name.

OTHER TIPS

Will this stylesheet help?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <table>
            <thead>
                <th>ID</th>
                <th>Display Name</th>
            </thead>
            <tbody>
                <xsl:apply-templates select="root/DATA"/>
            </tbody>
        </table>
    </xsl:template>

    <xsl:template match="DATA">
        <xsl:choose>
            <xsl:when test="ID='rd_bl'">
                <tr>
                    <td><xsl:value-of select="ID"/></td>
                    <td>Red to Blue</td>
                </tr>
            </xsl:when>
            <xsl:when test="ID='pu_gr'">
                <tr>
                    <td><xsl:value-of select="ID"/></td>
                    <td>Purple to Green</td>
                </tr>
            </xsl:when>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top