BeerXML

BeerXML is an open data standard used to exchange recipes and related beer brewing information. There are websites and mobile apps that support the standard. There are development packages available for a variety of software platforms and programming languages. It’s used by professionals to automate processes, and by hobbyists to share favorites. In short, it’s easy to find and/or create recipes in BeerXML format .

Displaying recipes within WordPress, then, is simply a matter of creating an XSL stylesheet to read and transform recipes from XML to HTML. The sample stylesheet here – beer.xsl – reads the input file, and creates a framework for detailed customization of the output later. For reference, required nodes are starred (eg, *NAME); optional nodes are omitted if empty; and display-only, extension nodes are prefixed with plus marks (eg, +DISPLAY_AMOUNT).

Note the use of <xsl:call-template name="util-super-global"> at the top of beer.xsl. A single XML data file can contain multiple recipes, so we are using the util-super-global template from plugins/xslt-processor/xsl/util.xsl to check PHP’s global _REQUEST array for the requested recipe number (eg, ?recipe=2). That allows switching between the recipes.


Version 1

[xslt_transform_xml xsl="case-study-beer/beer.xsl" xml="case-study-beer/four-recipes.xml" /]
Output v1:

RECIPES

  1. Burton Ale
  2. Dry Stout
  3. Porter
  4. Wit

Dry Stout

*NAME Dry Stout
*VERSION 1
*TYPE All Grain
*BREWER Brad Smith
*BATCH_SIZE 18.92716800
*BOIL_SIZE 20.81988500
*BOIL_TIME 60
*EFFICIENCY 72.0
DATE 4/1/2003
NOTES A very simple all grain beer that produces a great Guiness-style taste every time. So light in body that I have even made black and tans with it using a full body pale ale in the bottom of the glass.

*NAME Dry Stout (Irish)
*VERSION 1
*CATEGORY Stout
*CATEGORY_NUMBER 1
*STYLE_LETTER A
*STYLE_GUIDE BJCP 1999
*TYPE Ale
*OG_MIN 1.03600000
*OG_MAX 1.05000000
*FG_MIN 1.00700000
*FG_MAX 1.01200000
*IBU_MIN 30.0
*IBU_MAX 50.0
*COLOR_MIN 35.00000000
*COLOR_MAX 200.00000000
CARB_MIN 1.6
CARB_MAX 2.1>
ABV_MIN 3.0
ABV_MAX 5.5
PROFILE Full body perception from Flaked Barley, thought starting gravity may be low. Dry roasted flavor. Generous hops, though malt flavor will dominate. Complex fruity flavor. Black opaque color.
INGREDIENTS English malt. Roasted Barley and Flaked Barley for all grain. Some chocolate or black patent used in extract recipes. Goldings or Fuggles hops. Low sulfate, high calcium water.
EXAMPLES Guiness Stout
NOTES Famous Irish Stout (AKA Guiness). Dry roasted almost coffee like flavor. Irish versions have low starting gravity. Often mixed with soured, pasturized beer to give a slight acidity as well.
+DISPLAY_OG_MIN 1.036 SG
+DISPLAY_OG_MAX 1.050 SG
+DISPLAY_FG_MIN 1.007 SG
+DISPLAY_FG_MAX 1.012 SG
+DISPLAY_COLOR_MIN 35.0 SRM
+DISPLAY_COLOR_MAX 200.0 SRM
+OG_RANGE 1.036-1.050 SG
+FG_RANGE 1.007-1.012 SG
+IBU_RANGE 30.0-50.0 IBU
+CARB_RANGE 1.6-2.1 vols
+COLOR_RANGE 35.0-200.0 SRM
+ABV_RANGE 3.0-5.5 %

*NAME Brew Pot (6+gal) and Igloo/Gott Cooler (5 Gal)
*VERSION 1
*BOIL_SIZE 22.70566900
*BATCH_SIZE 18.927168
TUN_VOLUME 18.92716800
TUN_WEIGHT 1.814368
TUN_SPECIFIC_HEAT 0.300
TOP_UP_WATER 0.00000000
TRUB_CHILLER_LOSS 0.94635800
EVAP_RATE 9.0
BOIL_TIME 60.0
CALC_BOIL_VOLUME FALSE
LAUTER_DEADSPACE 0.94635800
TOP_UP_KETTLE 0.00000000
HOP_UTILIZATION 100.0
NOTES Popular all grain setup. 5 Gallon Gott or Igloo cooler as mash tun with false bottom, and 7-9 gallon brewpot capable of boiling at least 6 gallons of wort. Primarily used for single infusion mashes.
+DISPLAY_BOIL_SIZE 6.00 gal
+DISPLAY_BATCH_SIZE 5.00 gal
+DISPLAY_TUN_VOLUME 5.00 gal
+DISPLAY_TUN_WEIGHT 4.00 lb
+DISPLAY_TOP_UP_WATER 0.00 gal
+DISPLAY_TRUB_CHILLER_LOSS 0.25 gal
+DISPLAY_LAUTER_DEADSPACE 0.25 gal
+DISPLAY_TOP_UP_KETTLE 0.00 gal

HOP 1
*NAME Goldings, East Kent
*VERSION 1
*ALPHA 5.00
*AMOUNT 0.0637860
*USE Boil
*TIME 60.000
TYPE Aroma
FORM Pellet
BETA 3.50
HSI 35.0
ORIGIN United Kingdom
NOTES Used For: General purpose hops for bittering/finishing all British Ales Aroma: Floral, aromatic, earthy, slightly sweet spicy flavor Substitutes: Fuggles, BC Goldings Examples: Bass Pale Ale, Fullers ESB, Samual Smith’s Pale Ale
+DISPLAY_AMOUNT 2.25 oz
+INVENTORY 2.25 oz
+DISPLAY_TIME 60 min

FERMENTABLE 1
*NAME Pale Malt (2 Row) UK
*VERSION 1
*TYPE Grain
*AMOUNT 2.267960
*YIELD 78.0
COLOR 2.5
ADD_AFTER_BOIL FALSE
ORIGIN United Kingdom
COARSE_FINE_DIFF 1.5
MOISTURE 4.0
DIASTATIC_POWER 45.0
PROTEIN 10.1
MAX_IN_BATCH 100.0
RECOMMEND_MASH FALSE
IBU_GAL_PER_LB 0.000
NOTES Base malt for all English beer styles Lower diastatic power than American 2 Row Pale Malt
+DISPLAY_AMOUNT 5.00 lb
+POTENTIAL 1.036
+INVENTORY 5.00 lb
+DISPLAY_COLOR 2.5 SRM
FERMENTABLE 2
*NAME Barley, Flaked
*VERSION 1
*TYPE Grain
*AMOUNT 0.907184
*YIELD 70.0
COLOR 1.7
ADD_AFTER_BOIL FALSE
ORIGIN US
COARSE_FINE_DIFF 1.5
MOISTURE 9.0
DIASTATIC_POWER 0.0
PROTEIN 13.5
MAX_IN_BATCH 20.0
RECOMMEND_MASH TRUE
IBU_GAL_PER_LB 0.000
NOTES Adds significant body to Porters and Stouts. High haze producing protein prevents use in light beers.
+DISPLAY_AMOUNT 2.00 lb
+POTENTIAL 1.032
+INVENTORY 2.00 lb
+DISPLAY_COLOR 1.7 SRM
FERMENTABLE 3
*NAME Black Barley (Stout)
*VERSION 1
*TYPE Grain
*AMOUNT 0.453592
*YIELD 55.0
COLOR 500.0
ADD_AFTER_BOIL FALSE
ORIGIN US
COARSE_FINE_DIFF 1.5
MOISTURE 5.0
DIASTATIC_POWER 0.0
PROTEIN 13.2
MAX_IN_BATCH 10.0
RECOMMEND_MASH FALSE
IBU_GAL_PER_LB 0.000
NOTES Unmalted barley roasted at high temperature to create a dry, coffee like flavor. Imparts a sharp acrid flavor characteristic of dry stouts. Gives “dryness” to a stout or porter — much more so than regular Roasted Barley
+DISPLAY_AMOUNT 1.00 lb
+POTENTIAL 1.025
+INVENTORY 1.00 lb
+DISPLAY_COLOR 500.0 SRM

MISC 1
*NAME Irish Moss
*VERSION 1
*TYPE Fining
*USE Boil
*TIME 10.000
*AMOUNT 0.001232
AMOUNT_IS_WEIGHT FALSE
USE_FOR Clarity
NOTES Fining agent that aids in the post-boil protein break. Reduces protein chill haze and improves beer clarity.
+DISPLAY_AMOUNT 0.25 tsp
+INVENTORY 0.00 tsp
+DISPLAY_TIME 10.0 min
MISC 2
*NAME Gypsum (Calcium Sulfate)
*VERSION 1
*TYPE Water Agent
*USE Mash
*TIME 60.000
*AMOUNT 0.010000
AMOUNT_IS_WEIGHT TRUE
USE_FOR Water Agent
NOTES Reduces PH of water for mashing and sparging. Alters water profile — used to harden soft water. Use the BeerSmith Water Profile tool to determine amount to add.
+DISPLAY_AMOUNT 10.00 gm
+INVENTORY 0.00 gm
+DISPLAY_TIME 60.0 min

YEAST 1
*NAME Irish Ale
*VERSION 1
*TYPE Ale
*FORM Liquid
*AMOUNT 0.1250480
AMOUNT_IS_WEIGHT FALSE
LABORATORY Wyeast Labs
PRODUCT_ID 1084
MIN_TEMPERATURE 16.6667
MAX_TEMPERATURE 22.2222
FLOCCULATION Medium
ATTENUATION 73.0
BEST_FOR Irish Dry Stouts, Porter, Scottish Ale, Brown Ale, Imperial Stout, Barley Wine
TIMES_CULTURED 0
MAX_REUSE 5
ADD_TO_SECONDARY FALSE
NOTES Dry diacetyl, fruity flavor characteristic of stouts. Full bodied, dry, clean flavor.
+DISPLAY_AMOUNT 125 ml
+DISP_MIN_TEMP 62.0 F
+DISP_MAX_TEMP 72.0 F
+INVENTORY 0 Pkgs
+CULTURE_DATE 7/6/2003

WATER 1
*NAME Dublin, Ireland
*VERSION 1
*AMOUNT 18.927168
*CALCIUM 115.0
*BICARBONATE 200.0
*SULFATE 55.0
*CHLORIDE 19.0
*SODIUM 12.0
*MAGNESIUM 4.0
PH 8.0
NOTES Irish ale water – used for dark, malty strong ales with medium bitterness. Famous for dry stouts.
+DISPLAY_AMOUNT 5.00 gal

*NAME Single Infusion, Medium Body
*VERSION 1
*GRAIN_TEMP 22.22222200
*MASH_STEPS Mash In 1 Infusion 9.463584 60 67.77777800 2 67.77777800 Add 10.00 qt of water at 165.9 F 1.25 0.00 qt 165.9 F DISPLAY_STEP_TEMP 10.00 qt Mash Out 1 Infusion 6.056694 10 75.55555600 2 75.55555600 Add 6.40 qt of water at 193.1 F 2.05 0.00 qt 193.1 F DISPLAY_STEP_TEMP 6.40 qt
TUN_TEMP 22.22222200
SPARGE_TEMP 75.55555600
PH 5.4
TUN_WEIGHT 1.81436800
TUN_SPECIFIC_HEAT 0.30000000
EQUIP_ADJUST FALSE
+DISPLAY_GRAIN_TEMP 72.0 F
+DISPLAY_TUN_TEMP 72.0
+DISPLAY_SPARGE_TEMP 168.0 F
+DISPLAY_TUN_WEIGHT 4.00 lb

MASH_STEPS (2)

MASH_STEP 1
*NAME Mash In
*VERSION 1
*TYPE Infusion
*INFUSE_AMOUNT 9.463584
*STEP_TEMP 67.77777800
*STEP_TIME 60
RAMP_TIME 2
END_TEMP 67.77777800
+DESCRIPTION Add 10.00 qt of water at 165.9 F
+WATER_GRAIN_RATIO 1.25
+DECOCTION_AMT 0.00 qt
+INFUSE_TEMP 165.9 F
+DISPLAY_STEP_TEMP DISPLAY_STEP_TEMP
+DISPLAY_INFUSE_AMT 10.00 qt
MASH_STEP 2
*NAME Mash Out
*VERSION 1
*TYPE Infusion
*INFUSE_AMOUNT 6.056694
*STEP_TEMP 75.55555600
*STEP_TIME 10
RAMP_TIME 2
END_TEMP 75.55555600
+DESCRIPTION Add 6.40 qt of water at 193.1 F
+WATER_GRAIN_RATIO 2.05
+DECOCTION_AMT 0.00 qt
+INFUSE_TEMP 193.1 F
+DISPLAY_STEP_TEMP DISPLAY_STEP_TEMP
+DISPLAY_INFUSE_AMT 6.40 qt
XSL file – “case-study-beer/beer.xsl”
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" version="1.0" exclude-result-prefixes="exslt">

    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:include href="../../plugins/tenandtwo-xslt-processor/xsl/util.xsl"/>

    <!-- main -->
    <xsl:template match="/">

        <!-- get recipe number from $_REQUEST['recipe'] -->
        <xsl:variable name="recipe_idx">
            <xsl:call-template name="util-super-global">
                <xsl:with-param name="global" select="'_REQUEST'"/>
                <xsl:with-param name="index">recipe</xsl:with-param>
            </xsl:call-template>
        </xsl:variable>

        <!-- count recipes in the data -->
        <xsl:variable name="recipe_max">
            <xsl:value-of select="count(//RECIPE)"/>
        </xsl:variable>

        <!-- get final index of recipe to display -->
        <xsl:variable name="selected">
            <xsl:choose>
                <xsl:when test="$recipe_idx &gt; $recipe_max or $recipe_idx = 'last'">
                    <xsl:value-of select="$recipe_max"/>
                </xsl:when>
                <xsl:when test="$recipe_idx &gt; 0">
                    <xsl:value-of select="$recipe_idx"/>
                </xsl:when>
                <xsl:otherwise>1</xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <!-- begin output -->
        <xsl:apply-templates select="RECIPES">
            <xsl:with-param name="selected" select="number($selected)"/>
        </xsl:apply-templates>
    </xsl:template>


    <!-- RECIPES -->
    <xsl:template match="RECIPES">
        <xsl:param name="selected"/>

        <!-- output links -->
        <div id="beerxml-recipes">
            <h3>RECIPES</h3>
            <ol>
                <xsl:apply-templates select="RECIPE" mode="index">
                    <xsl:with-param name="selected" select="$selected"/>
                </xsl:apply-templates>
            </ol>
        </div>

        <!-- output details -->
        <xsl:apply-templates select="RECIPE[$selected]"/>

    </xsl:template>

    <!-- RECIPE -->
    <xsl:template match="RECIPE" mode="index">
        <xsl:param name="selected"/>

        <li>
        <xsl:choose>
            <xsl:when test="position() = $selected">
                <b>
                    <xsl:value-of disable-output-escaping="yes" select="NAME"/>
                </b>
            </xsl:when>
            <xsl:otherwise>
                <a>
                    <xsl:attribute name="href"><xsl:value-of select="concat('?recipe=',position())"/></xsl:attribute>
                    <xsl:value-of disable-output-escaping="yes" select="NAME"/>
                </a>
            </xsl:otherwise>
        </xsl:choose>
        </li>
    </xsl:template>

    <!-- RECIPE -->
    <xsl:template match="RECIPE">
        <div id="beerxml-recipe">
            <h2><xsl:value-of disable-output-escaping="yes" select="NAME"/></h2>
<!--
<xsl:call-template name="RECIPE_HEADER" />
<xsl:apply-templates select="STYLE" />
<xsl:apply-templates select="EQUIPMENT" />
<xsl:apply-templates select="HOPS" />
<xsl:apply-templates select="FERMENTABLES" />
<xsl:apply-templates select="MISCS" />
<xsl:apply-templates select="YEASTS" />
<xsl:apply-templates select="WATERS" />
<xsl:apply-templates select="MASH" />
<xsl:call-template name="RECIPE_FOOTER" />
 -->
            <div class="accordion" id="beerxml-recipe-sections">
                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-header">
                        <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-header" aria-expanded="true" aria-controls="section-body-header">
                            <h4>RECIPE-HEADER</h4>
                        </button>
                    </h2>
                    <div id="section-body-header" class="accordion-collapse collapse show" aria-labelledby="section-label-header">
                        <div class="accordion-body">
                            <xsl:call-template name="RECIPE_HEADER"/>
                        </div>
                    </div>
                </div>

                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-style">
                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-style" aria-expanded="false" aria-controls="section-body-style">
                            <h4>STYLE</h4>
                        </button>
                    </h2>
                    <div id="section-body-style" class="accordion-collapse collapse" aria-labelledby="section-label-style">
                        <div class="accordion-body">
                            <xsl:apply-templates select="STYLE"/>
                        </div>
                    </div>
                </div>

                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-equipment">
                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-equipment" aria-expanded="false" aria-controls="section-body-equipment">
                            <h4>EQUIPMENT</h4>
                        </button>
                    </h2>
                    <div id="section-body-equipment" class="accordion-collapse collapse" aria-labelledby="section-label-equipment">
                        <div class="accordion-body">
                            <xsl:apply-templates select="EQUIPMENT"/>
                        </div>
                    </div>
                </div>

                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-hops">
                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-hops" aria-expanded="false" aria-controls="section-body-hops">
                            <h4>HOPS (<xsl:value-of select="count(HOPS/HOP)"/>)</h4>
                        </button>
                    </h2>
                    <div id="section-body-hops" class="accordion-collapse collapse" aria-labelledby="section-label-hops">
                        <div class="accordion-body">
                            <xsl:apply-templates select="HOPS"/>
                        </div>
                    </div>
                </div>

                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-fermentables">
                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-fermentables" aria-expanded="false" aria-controls="section-body-fermentables">
                            <h4>FERMENTABLES (<xsl:value-of select="count(FERMENTABLES/FERMENTABLE)"/>)</h4>
                        </button>
                    </h2>
                    <div id="section-body-fermentables" class="accordion-collapse collapse" aria-labelledby="section-label-fermentables">
                        <div class="accordion-body">
                            <xsl:apply-templates select="FERMENTABLES"/>
                        </div>
                    </div>
                </div>

                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-miscs">
                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-miscs" aria-expanded="false" aria-controls="section-body-miscs">
                            <h4>MISCS (<xsl:value-of select="count(MISCS/MISC)"/>)</h4>
                        </button>
                    </h2>
                    <div id="section-body-miscs" class="accordion-collapse collapse" aria-labelledby="section-label-miscs">
                        <div class="accordion-body">
                            <xsl:apply-templates select="MISCS"/>
                        </div>
                    </div>
                </div>

                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-yeasts">
                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-yeasts" aria-expanded="false" aria-controls="section-body-yeasts">
                            <h4>YEASTS (<xsl:value-of select="count(YEASTS/YEAST)"/>)</h4>
                        </button>
                    </h2>
                    <div id="section-body-yeasts" class="accordion-collapse collapse" aria-labelledby="section-label-yeasts">
                        <div class="accordion-body">
                            <xsl:apply-templates select="YEASTS"/>
                        </div>
                    </div>
                </div>

                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-waters">
                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-waters" aria-expanded="false" aria-controls="section-body-waters">
                            <h4>WATERS (<xsl:value-of select="count(WATERS/WATER)"/>)</h4>
                        </button>
                    </h2>
                    <div id="section-body-waters" class="accordion-collapse collapse" aria-labelledby="section-label-waters">
                        <div class="accordion-body">
                            <xsl:apply-templates select="WATERS"/>
                        </div>
                    </div>
                </div>

                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-mash">
                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-mash" aria-expanded="false" aria-controls="section-body-mash">
                            <h4>MASH</h4>
                        </button>
                    </h2>
                    <div id="section-body-mash" class="accordion-collapse collapse" aria-labelledby="section-label-mash">
                        <div class="accordion-body">
                            <xsl:apply-templates select="MASH"/>
                        </div>
                    </div>
                </div>

                <div class="accordion-item">
                    <h2 class="accordion-header" id="section-label-footer">
                        <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#section-body-footer" aria-expanded="false" aria-controls="section-body-footer">
                            <h4>RECIPE_FOOTER</h4>
                        </button>
                    </h2>
                    <div id="section-body-footer" class="accordion-collapse collapse" aria-labelledby="section-label-footer">
                        <div class="accordion-body">
                            <xsl:call-template name="RECIPE_FOOTER"/>
                        </div>
                    </div>
                </div>
            </div>  <!-- end class="accordion" -->

        </div>  <!-- end id="beerxml-recipe" -->
    </xsl:template>

    <!-- -->
    <xsl:template name="RECIPE_HEADER">
        <div id="beerxml-recipe-header">
            <!-- <h4>RECIPE-HEADER</h4> -->
            <table class="table table-sm table-bordered">
            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*TYPE</td><td><xsl:value-of disable-output-escaping="yes" select="TYPE"/></td></tr>
            <tr><td class="text-end">*BREWER</td><td><xsl:value-of disable-output-escaping="yes" select="BREWER"/></td></tr>
            <xsl:if test="string-length(ASST_BREWER)">
                <tr><td class="text-end">ASST_BREWER</td><td><xsl:value-of disable-output-escaping="yes" select="ASST_BREWER"/></td></tr>
            </xsl:if>
            <tr><td class="text-end">*BATCH_SIZE</td><td><xsl:value-of disable-output-escaping="yes" select="BATCH_SIZE"/></td></tr>
            <tr><td class="text-end">*BOIL_SIZE</td><td><xsl:value-of disable-output-escaping="yes" select="BOIL_SIZE"/></td></tr>
            <tr><td class="text-end">*BOIL_TIME</td><td><xsl:value-of disable-output-escaping="yes" select="BOIL_TIME"/></td></tr>
            <tr><td class="text-end">*EFFICIENCY</td><td><xsl:value-of disable-output-escaping="yes" select="EFFICIENCY"/></td></tr>
            <xsl:if test="string-length(DATE)">
                <tr><td class="text-end">DATE</td><td><xsl:value-of disable-output-escaping="yes" select="DATE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(NOTES)">
                <tr><td class="text-end">NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="NOTES"/></td></tr>
            </xsl:if>
            </table>
        </div>
    </xsl:template>

    <!-- -->
    <xsl:template name="RECIPE_FOOTER">
        <div id="beerxml-recipe-footer">
            <!-- <h4>RECIPE_FOOTER</h4> -->
            <table class="table table-sm table-bordered">

            <xsl:if test="string-length(OG)">
                <tr><td class="text-end">OG</td><td><xsl:value-of disable-output-escaping="yes" select="OG"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(FG)">
                <tr><td class="text-end">FG</td><td><xsl:value-of disable-output-escaping="yes" select="FG"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(FERMENTATION_STAGES)">
                <tr><td class="text-end">FERMENTATION_STAGES</td><td><xsl:value-of disable-output-escaping="yes" select="FERMENTATION_STAGES"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(PRIMARY_AGE)">
                <tr><td class="text-end">PRIMARY_AGE</td><td><xsl:value-of disable-output-escaping="yes" select="PRIMARY_AGE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(PRIMARY_TEMP)">
                <tr><td class="text-end">PRIMARY_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="PRIMARY_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(SECONDARY_AGE)">
                <tr><td class="text-end">SECONDARY_AGE</td><td><xsl:value-of disable-output-escaping="yes" select="SECONDARY_AGE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(SECONDARY_TEMP)">
                <tr><td class="text-end">SECONDARY_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="SECONDARY_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TERTIARY_AGE)">
                <tr><td class="text-end">TERTIARY_AGE</td><td><xsl:value-of disable-output-escaping="yes" select="TERTIARY_AGE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TERTIARY_TEMP)">
                <tr><td class="text-end">TERTIARY_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="TERTIARY_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(AGE)">
                <tr><td class="text-end">AGE</td><td><xsl:value-of disable-output-escaping="yes" select="AGE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(AGE_TEMP)">
                <tr><td class="text-end">AGE_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="AGE_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(CARBONATION)">
                <tr><td class="text-end">CARBONATION</td><td><xsl:value-of disable-output-escaping="yes" select="CARBONATION"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(FORCED_CARBONATION)">
                <tr><td class="text-end">FORCED_CARBONATION</td><td><xsl:value-of disable-output-escaping="yes" select="FORCED_CARBONATION"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(PRIMING_SUGAR_NAME)">
                <tr><td class="text-end">PRIMING_SUGAR_NAME</td><td><xsl:value-of disable-output-escaping="yes" select="PRIMING_SUGAR_NAME"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(CARBONATION_TEMP)">
                <tr><td class="text-end">CARBONATION_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="CARBONATION_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(PRIMING_SUGAR_EQUIV)">
                <tr><td class="text-end">PRIMING_SUGAR_EQUIV</td><td><xsl:value-of disable-output-escaping="yes" select="PRIMING_SUGAR_EQUIV"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(KEG_PRIMING_FACTOR)">
                <tr><td class="text-end">KEG_PRIMING_FACTOR</td><td><xsl:value-of disable-output-escaping="yes" select="KEG_PRIMING_FACTOR"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TASTE_RATING)">
                <tr><td class="text-end">TASTE_RATING</td><td><xsl:value-of disable-output-escaping="yes" select="TASTE_RATING"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TASTE_NOTES)">
                <tr><td class="text-end">TASTE_NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="TASTE_NOTES"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(EST_OG)">
                <tr><td class="text-end">+EST_OG</td><td><xsl:value-of disable-output-escaping="yes" select="EST_OG"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(EST_FG)">
                <tr><td class="text-end">+EST_FG</td><td><xsl:value-of disable-output-escaping="yes" select="EST_FG"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(EST_COLOR)">
                <tr><td class="text-end">+EST_COLOR</td><td><xsl:value-of disable-output-escaping="yes" select="EST_COLOR"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(IBU)">
                <tr><td class="text-end">+IBU</td><td><xsl:value-of disable-output-escaping="yes" select="IBU"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(IBU_METHOD)">
                <tr><td class="text-end">+IBU_METHOD</td><td><xsl:value-of disable-output-escaping="yes" select="IBU_METHOD"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(EST_ABV)">
                <tr><td class="text-end">+EST_ABV</td><td><xsl:value-of disable-output-escaping="yes" select="EST_ABV"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ABV)">
                <tr><td class="text-end">+ABV</td><td><xsl:value-of disable-output-escaping="yes" select="ABV"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ACTUAL_EFFICIENCY)">
                <tr><td class="text-end">+ACTUAL_EFFICIENCY</td><td><xsl:value-of disable-output-escaping="yes" select="ACTUAL_EFFICIENCY"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(CALORIES)">
                <tr><td class="text-end">+CALORIES</td><td><xsl:value-of disable-output-escaping="yes" select="CALORIES"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_BATCH_SIZE)">
                <tr><td class="text-end">+DISPLAY_BATCH_SIZE</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_BATCH_SIZE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_BOIL_SIZE)">
                <tr><td class="text-end">+DISPLAY_BOIL_SIZE</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_BOIL_SIZE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_OG)">
                <tr><td class="text-end">+DISPLAY_OG</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_OG"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_FG)">
                <tr><td class="text-end">+DISPLAY_FG</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_FG"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_PRIMARY_TEMP)">
                <tr><td class="text-end">+DISPLAY_PRIMARY_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_PRIMARY_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_SECONDARY_TEMP)">
                <tr><td class="text-end">+DISPLAY_SECONDARY_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_SECONDARY_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TERTIARY_TEMP)">
                <tr><td class="text-end">+DISPLAY_TERTIARY_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TERTIARY_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_AGE_TEMP)">
                <tr><td class="text-end">+DISPLAY_AGE_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_AGE_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(CARBONATION_USED)">
                <tr><td class="text-end">+CARBONATION_USED</td><td><xsl:value-of disable-output-escaping="yes" select="CARBONATION_USED"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_CARB_TEMP)">
                <tr><td class="text-end">+DISPLAY_CARB_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_CARB_TEMP"/></td></tr>
            </xsl:if>

            </table>
        </div>
    </xsl:template>

    <!-- STYLE -->
    <xsl:template match="STYLE">
        <div id="beerxml-style">
            <!-- <h4>STYLE</h4> -->
            <table class="table table-sm table-bordered">

            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*CATEGORY</td><td><xsl:value-of disable-output-escaping="yes" select="CATEGORY"/></td></tr>
            <tr><td class="text-end">*CATEGORY_NUMBER</td><td><xsl:value-of disable-output-escaping="yes" select="CATEGORY_NUMBER"/></td></tr>
            <tr><td class="text-end">*STYLE_LETTER</td><td><xsl:value-of disable-output-escaping="yes" select="STYLE_LETTER"/></td></tr>
            <tr><td class="text-end">*STYLE_GUIDE</td><td><xsl:value-of disable-output-escaping="yes" select="STYLE_GUIDE"/></td></tr>
            <tr><td class="text-end">*TYPE</td><td><xsl:value-of disable-output-escaping="yes" select="TYPE"/></td></tr>
            <tr><td class="text-end">*OG_MIN</td><td><xsl:value-of disable-output-escaping="yes" select="OG_MIN"/></td></tr>
            <tr><td class="text-end">*OG_MAX</td><td><xsl:value-of disable-output-escaping="yes" select="OG_MAX"/></td></tr>
            <tr><td class="text-end">*FG_MIN</td><td><xsl:value-of disable-output-escaping="yes" select="FG_MIN"/></td></tr>
            <tr><td class="text-end">*FG_MAX</td><td><xsl:value-of disable-output-escaping="yes" select="FG_MAX"/></td></tr>
            <tr><td class="text-end">*IBU_MIN</td><td><xsl:value-of disable-output-escaping="yes" select="IBU_MIN"/></td></tr>
            <tr><td class="text-end">*IBU_MAX</td><td><xsl:value-of disable-output-escaping="yes" select="IBU_MAX"/></td></tr>
            <tr><td class="text-end">*COLOR_MIN</td><td><xsl:value-of disable-output-escaping="yes" select="COLOR_MIN"/></td></tr>
            <tr><td class="text-end">*COLOR_MAX</td><td><xsl:value-of disable-output-escaping="yes" select="COLOR_MAX"/></td></tr>

            <xsl:if test="string-length(CARB_MIN)">
                <tr><td class="text-end">CARB_MIN</td><td><xsl:value-of disable-output-escaping="yes" select="CARB_MIN"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(CARB_MAX)">
                <tr><td class="text-end">CARB_MAX</td><td><xsl:value-of disable-output-escaping="yes" select="CARB_MAX"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ABV_MIN)">
                <tr><td class="text-end">ABV_MIN</td><td><xsl:value-of disable-output-escaping="yes" select="ABV_MIN"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ABV_MAX)">
                <tr><td class="text-end">ABV_MAX</td><td><xsl:value-of disable-output-escaping="yes" select="ABV_MAX"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(PROFILE)">
                <tr><td class="text-end">PROFILE</td><td><xsl:value-of disable-output-escaping="yes" select="PROFILE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(INGREDIENTS)">
                <tr><td class="text-end">INGREDIENTS</td><td><xsl:value-of disable-output-escaping="yes" select="INGREDIENTS"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(EXAMPLES)">
                <tr><td class="text-end">EXAMPLES</td><td><xsl:value-of disable-output-escaping="yes" select="EXAMPLES"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(NOTES)">
                <tr><td class="text-end">NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="NOTES"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(DISPLAY_OG_MIN)">
                <tr><td class="text-end">+DISPLAY_OG_MIN</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_OG_MIN"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_OG_MAX)">
                <tr><td class="text-end">+DISPLAY_OG_MAX</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_OG_MAX"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_FG_MIN)">
                <tr><td class="text-end">+DISPLAY_FG_MIN</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_FG_MIN"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_FG_MAX)">
                <tr><td class="text-end">+DISPLAY_FG_MAX</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_FG_MAX"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_COLOR_MIN)">
                <tr><td class="text-end">+DISPLAY_COLOR_MIN</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_COLOR_MIN"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_COLOR_MAX)">
                <tr><td class="text-end">+DISPLAY_COLOR_MAX</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_COLOR_MAX"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(OG_RANGE)">
                <tr><td class="text-end">+OG_RANGE</td><td><xsl:value-of disable-output-escaping="yes" select="OG_RANGE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(FG_RANGE)">
                <tr><td class="text-end">+FG_RANGE</td><td><xsl:value-of disable-output-escaping="yes" select="FG_RANGE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(IBU_RANGE)">
                <tr><td class="text-end">+IBU_RANGE</td><td><xsl:value-of disable-output-escaping="yes" select="IBU_RANGE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(CARB_RANGE)">
                <tr><td class="text-end">+CARB_RANGE</td><td><xsl:value-of disable-output-escaping="yes" select="CARB_RANGE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(COLOR_RANGE)">
                <tr><td class="text-end">+COLOR_RANGE</td><td><xsl:value-of disable-output-escaping="yes" select="COLOR_RANGE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ABV_RANGE)">
                <tr><td class="text-end">+ABV_RANGE</td><td><xsl:value-of disable-output-escaping="yes" select="ABV_RANGE"/></td></tr>
            </xsl:if>

            </table>
        </div>
    </xsl:template>

    <!-- EQUIPMENT -->
    <xsl:template match="EQUIPMENT">
        <div id="beerxml-equipment">
            <!-- <h4>EQUIPMENT</h4> -->
            <table class="table table-sm table-bordered">

            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*BOIL_SIZE</td><td><xsl:value-of disable-output-escaping="yes" select="BOIL_SIZE"/></td></tr>
            <tr><td class="text-end">*BATCH_SIZE</td><td><xsl:value-of disable-output-escaping="yes" select="BATCH_SIZE"/></td></tr>

            <xsl:if test="string-length(TUN_VOLUME)">
                <tr><td class="text-end">TUN_VOLUME</td><td><xsl:value-of disable-output-escaping="yes" select="TUN_VOLUME"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TUN_WEIGHT)">
                <tr><td class="text-end">TUN_WEIGHT</td><td><xsl:value-of disable-output-escaping="yes" select="TUN_WEIGHT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TUN_SPECIFIC_HEAT)">
                <tr><td class="text-end">TUN_SPECIFIC_HEAT</td><td><xsl:value-of disable-output-escaping="yes" select="TUN_SPECIFIC_HEAT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TOP_UP_WATER)">
                <tr><td class="text-end">TOP_UP_WATER</td><td><xsl:value-of disable-output-escaping="yes" select="TOP_UP_WATER"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TRUB_CHILLER_LOSS)">
                <tr><td class="text-end">TRUB_CHILLER_LOSS</td><td><xsl:value-of disable-output-escaping="yes" select="TRUB_CHILLER_LOSS"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(EVAP_RATE)">
                <tr><td class="text-end">EVAP_RATE</td><td><xsl:value-of disable-output-escaping="yes" select="EVAP_RATE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(BOIL_TIME)">
                <tr><td class="text-end">BOIL_TIME</td><td><xsl:value-of disable-output-escaping="yes" select="BOIL_TIME"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(CALC_BOIL_VOLUME)">
                <tr><td class="text-end">CALC_BOIL_VOLUME</td><td><xsl:value-of disable-output-escaping="yes" select="CALC_BOIL_VOLUME"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(LAUTER_DEADSPACE)">
                <tr><td class="text-end">LAUTER_DEADSPACE</td><td><xsl:value-of disable-output-escaping="yes" select="LAUTER_DEADSPACE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TOP_UP_KETTLE)">
                <tr><td class="text-end">TOP_UP_KETTLE</td><td><xsl:value-of disable-output-escaping="yes" select="TOP_UP_KETTLE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(HOP_UTILIZATION)">
                <tr><td class="text-end">HOP_UTILIZATION</td><td><xsl:value-of disable-output-escaping="yes" select="HOP_UTILIZATION"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(NOTES)">
                <tr><td class="text-end">NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="NOTES"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(DISPLAY_BOIL_SIZE)">
                <tr><td class="text-end">+DISPLAY_BOIL_SIZE</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_BOIL_SIZE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_BATCH_SIZE)">
                <tr><td class="text-end">+DISPLAY_BATCH_SIZE</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_BATCH_SIZE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TUN_VOLUME)">
                <tr><td class="text-end">+DISPLAY_TUN_VOLUME</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TUN_VOLUME"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TUN_WEIGHT)">
                <tr><td class="text-end">+DISPLAY_TUN_WEIGHT</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TUN_WEIGHT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TOP_UP_WATER)">
                <tr><td class="text-end">+DISPLAY_TOP_UP_WATER</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TOP_UP_WATER"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TRUB_CHILLER_LOSS)">
                <tr><td class="text-end">+DISPLAY_TRUB_CHILLER_LOSS</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TRUB_CHILLER_LOSS"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_LAUTER_DEADSPACE)">
                <tr><td class="text-end">+DISPLAY_LAUTER_DEADSPACE</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_LAUTER_DEADSPACE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TOP_UP_KETTLE)">
                <tr><td class="text-end">+DISPLAY_TOP_UP_KETTLE</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TOP_UP_KETTLE"/></td></tr>
            </xsl:if>

            </table>
        </div>
    </xsl:template>

    <!-- HOPS -->
    <xsl:template match="HOPS">
        <div id="beerxml-hops">
            <!-- <h4>HOPS (<xsl:value-of select="count(HOP)" />)</h4> -->
            <xsl:apply-templates select="HOP"/>
        </div>
    </xsl:template>

    <!-- HOPS/HOP -->
    <xsl:template match="HOP">
        <div id="beerxml-hop">
            <h5>HOP <xsl:value-of select="position()"/></h5>
            <table class="table table-sm table-bordered">

            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*ALPHA</td><td><xsl:value-of disable-output-escaping="yes" select="ALPHA"/></td></tr>
            <tr><td class="text-end">*AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="AMOUNT"/></td></tr>
            <tr><td class="text-end">*USE</td><td><xsl:value-of disable-output-escaping="yes" select="USE"/></td></tr>
            <tr><td class="text-end">*TIME</td><td><xsl:value-of disable-output-escaping="yes" select="TIME"/></td></tr>

            <xsl:if test="string-length(TYPE)">
                <tr><td class="text-end">TYPE</td><td><xsl:value-of disable-output-escaping="yes" select="TYPE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(FORM)">
                <tr><td class="text-end">FORM</td><td><xsl:value-of disable-output-escaping="yes" select="FORM"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(BETA)">
                <tr><td class="text-end">BETA</td><td><xsl:value-of disable-output-escaping="yes" select="BETA"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(HSI)">
                <tr><td class="text-end">HSI</td><td><xsl:value-of disable-output-escaping="yes" select="HSI"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ORIGIN)">
                <tr><td class="text-end">ORIGIN</td><td><xsl:value-of disable-output-escaping="yes" select="ORIGIN"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(SUBSTITUTES)">
                <tr><td class="text-end">SUBSTITUTES</td><td><xsl:value-of disable-output-escaping="yes" select="SUBSTITUTES"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(HUMULENE)">
                <tr><td class="text-end">HUMULENE</td><td><xsl:value-of disable-output-escaping="yes" select="HUMULENE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(CARYOPHYLLENE)">
                <tr><td class="text-end">CARYOPHYLLENE</td><td><xsl:value-of disable-output-escaping="yes" select="CARYOPHYLLENE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(COHUMULONE)">
                <tr><td class="text-end">COHUMULONE</td><td><xsl:value-of disable-output-escaping="yes" select="COHUMULONE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(MYRCENE)">
                <tr><td class="text-end">MYRCENE</td><td><xsl:value-of disable-output-escaping="yes" select="MYRCENE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(NOTES)">
                <tr><td class="text-end">NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="NOTES"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(DISPLAY_AMOUNT)">
                <tr><td class="text-end">+DISPLAY_AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_AMOUNT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(INVENTORY)">
                <tr><td class="text-end">+INVENTORY</td><td><xsl:value-of disable-output-escaping="yes" select="INVENTORY"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TIME)">
                <tr><td class="text-end">+DISPLAY_TIME</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TIME"/></td></tr>
            </xsl:if>

            </table>
        </div>
    </xsl:template>

    <!-- FERMENTABLES -->
    <xsl:template match="FERMENTABLES">
        <div id="beerxml-fermentables">
            <!-- <h4>FERMENTABLES (<xsl:value-of select="count(FERMENTABLE)" />)</h4> -->
            <xsl:apply-templates select="FERMENTABLE"/>
        </div>
    </xsl:template>

    <!-- FERMENTABLES/FERMENTABLE -->
    <xsl:template match="FERMENTABLE">
        <div id="beerxml-fermentable">
            <h5>FERMENTABLE <xsl:value-of select="position()"/></h5>
            <table class="table table-sm table-bordered">

            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*TYPE</td><td><xsl:value-of disable-output-escaping="yes" select="TYPE"/></td></tr>
            <tr><td class="text-end">*AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="AMOUNT"/></td></tr>
            <tr><td class="text-end">*YIELD</td><td><xsl:value-of disable-output-escaping="yes" select="YIELD"/></td></tr>

            <xsl:if test="string-length(COLOR)">
                <tr><td class="text-end">COLOR</td><td><xsl:value-of disable-output-escaping="yes" select="COLOR"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ADD_AFTER_BOIL)">
                <tr><td class="text-end">ADD_AFTER_BOIL</td><td><xsl:value-of disable-output-escaping="yes" select="ADD_AFTER_BOIL"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ORIGIN)">
                <tr><td class="text-end">ORIGIN</td><td><xsl:value-of disable-output-escaping="yes" select="ORIGIN"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(SUPPLIER)">
                <tr><td class="text-end">SUPPLIER</td><td><xsl:value-of disable-output-escaping="yes" select="SUPPLIER"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(COARSE_FINE_DIFF)">
                <tr><td class="text-end">COARSE_FINE_DIFF</td><td><xsl:value-of disable-output-escaping="yes" select="COARSE_FINE_DIFF"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(MOISTURE)">
                <tr><td class="text-end">MOISTURE</td><td><xsl:value-of disable-output-escaping="yes" select="MOISTURE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DIASTATIC_POWER)">
                <tr><td class="text-end">DIASTATIC_POWER</td><td><xsl:value-of disable-output-escaping="yes" select="DIASTATIC_POWER"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(PROTEIN)">
                <tr><td class="text-end">PROTEIN</td><td><xsl:value-of disable-output-escaping="yes" select="PROTEIN"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(MAX_IN_BATCH)">
                <tr><td class="text-end">MAX_IN_BATCH</td><td><xsl:value-of disable-output-escaping="yes" select="MAX_IN_BATCH"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(RECOMMEND_MASH)">
                <tr><td class="text-end">RECOMMEND_MASH</td><td><xsl:value-of disable-output-escaping="yes" select="RECOMMEND_MASH"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(IBU_GAL_PER_LB)">
                <tr><td class="text-end">IBU_GAL_PER_LB</td><td><xsl:value-of disable-output-escaping="yes" select="IBU_GAL_PER_LB"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(NOTES)">
                <tr><td class="text-end">NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="NOTES"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(DISPLAY_AMOUNT)">
                <tr><td class="text-end">+DISPLAY_AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_AMOUNT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(POTENTIAL)">
                <tr><td class="text-end">+POTENTIAL</td><td><xsl:value-of disable-output-escaping="yes" select="POTENTIAL"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(INVENTORY)">
                <tr><td class="text-end">+INVENTORY</td><td><xsl:value-of disable-output-escaping="yes" select="INVENTORY"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_COLOR)">
                <tr><td class="text-end">+DISPLAY_COLOR</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_COLOR"/></td></tr>
            </xsl:if>

            </table>
        </div>
    </xsl:template>

    <!-- MISCS -->
    <xsl:template match="MISCS">
        <div id="beerxml-miscs">
            <!-- <h4>MISCS (<xsl:value-of select="count(MISC)" />)</h4> -->
            <xsl:apply-templates select="MISC"/>
        </div>
    </xsl:template>

    <!-- MISCS/MISC-->
    <xsl:template match="MISC">
        <div id="beerxml-misc">
            <h5>MISC <xsl:value-of select="position()"/></h5>
            <table class="table table-sm table-bordered">

            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*TYPE</td><td><xsl:value-of disable-output-escaping="yes" select="TYPE"/></td></tr>
            <tr><td class="text-end">*USE</td><td><xsl:value-of disable-output-escaping="yes" select="USE"/></td></tr>
            <tr><td class="text-end">*TIME</td><td><xsl:value-of disable-output-escaping="yes" select="TIME"/></td></tr>
            <tr><td class="text-end">*AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="AMOUNT"/></td></tr>

            <xsl:if test="string-length(AMOUNT_IS_WEIGHT)">
                <tr><td class="text-end">AMOUNT_IS_WEIGHT</td><td><xsl:value-of disable-output-escaping="yes" select="AMOUNT_IS_WEIGHT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(USE_FOR)">
                <tr><td class="text-end">USE_FOR</td><td><xsl:value-of disable-output-escaping="yes" select="USE_FOR"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(NOTES)">
                <tr><td class="text-end">NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="NOTES"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(DISPLAY_AMOUNT)">
                <tr><td class="text-end">+DISPLAY_AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_AMOUNT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(INVENTORY)">
                <tr><td class="text-end">+INVENTORY</td><td><xsl:value-of disable-output-escaping="yes" select="INVENTORY"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TIME)">
                <tr><td class="text-end">+DISPLAY_TIME</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TIME"/></td></tr>
            </xsl:if>

            </table>
        </div>
    </xsl:template>

    <!-- YEASTS -->
    <xsl:template match="YEASTS">
        <div id="beerxml-yeasts">
            <!-- <h4>YEASTS (<xsl:value-of select="count(YEAST)" />)</h4> -->
            <xsl:apply-templates select="YEAST"/>
        </div>
    </xsl:template>

    <!-- YEASTS/YEAST -->
    <xsl:template match="YEAST">
        <div id="beerxml-yeast">
            <h5>YEAST <xsl:value-of select="position()"/></h5>
            <table class="table table-sm table-bordered">

            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*TYPE</td><td><xsl:value-of disable-output-escaping="yes" select="TYPE"/></td></tr>
            <tr><td class="text-end">*FORM</td><td><xsl:value-of disable-output-escaping="yes" select="FORM"/></td></tr>
            <tr><td class="text-end">*AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="AMOUNT"/></td></tr>

            <xsl:if test="string-length(AMOUNT_IS_WEIGHT)">
                <tr><td class="text-end">AMOUNT_IS_WEIGHT</td><td><xsl:value-of disable-output-escaping="yes" select="AMOUNT_IS_WEIGHT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(LABORATORY)">
                <tr><td class="text-end">LABORATORY</td><td><xsl:value-of disable-output-escaping="yes" select="LABORATORY"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(PRODUCT_ID)">
                <tr><td class="text-end">PRODUCT_ID</td><td><xsl:value-of disable-output-escaping="yes" select="PRODUCT_ID"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(MIN_TEMPERATURE)">
                <tr><td class="text-end">MIN_TEMPERATURE</td><td><xsl:value-of disable-output-escaping="yes" select="MIN_TEMPERATURE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(MAX_TEMPERATURE)">
                <tr><td class="text-end">MAX_TEMPERATURE</td><td><xsl:value-of disable-output-escaping="yes" select="MAX_TEMPERATURE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(FLOCCULATION)">
                <tr><td class="text-end">FLOCCULATION</td><td><xsl:value-of disable-output-escaping="yes" select="FLOCCULATION"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ATTENUATION)">
                <tr><td class="text-end">ATTENUATION</td><td><xsl:value-of disable-output-escaping="yes" select="ATTENUATION"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(BEST_FOR)">
                <tr><td class="text-end">BEST_FOR</td><td><xsl:value-of disable-output-escaping="yes" select="BEST_FOR"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TIMES_CULTURED)">
                <tr><td class="text-end">TIMES_CULTURED</td><td><xsl:value-of disable-output-escaping="yes" select="TIMES_CULTURED"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(MAX_REUSE)">
                <tr><td class="text-end">MAX_REUSE</td><td><xsl:value-of disable-output-escaping="yes" select="MAX_REUSE"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(ADD_TO_SECONDARY)">
                <tr><td class="text-end">ADD_TO_SECONDARY</td><td><xsl:value-of disable-output-escaping="yes" select="ADD_TO_SECONDARY"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(NOTES)">
                <tr><td class="text-end">NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="NOTES"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(DISPLAY_AMOUNT)">
                <tr><td class="text-end">+DISPLAY_AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_AMOUNT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISP_MIN_TEMP)">
                <tr><td class="text-end">+DISP_MIN_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISP_MIN_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISP_MAX_TEMP)">
                <tr><td class="text-end">+DISP_MAX_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISP_MAX_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(INVENTORY)">
                <tr><td class="text-end">+INVENTORY</td><td><xsl:value-of disable-output-escaping="yes" select="INVENTORY"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(CULTURE_DATE)">
                <tr><td class="text-end">+CULTURE_DATE</td><td><xsl:value-of disable-output-escaping="yes" select="CULTURE_DATE"/></td></tr>
            </xsl:if>

            </table>
        </div>
    </xsl:template>

    <!-- WATERS -->
    <xsl:template match="WATERS">
        <div id="beerxml-waters">
            <!-- <h4>WATERS (<xsl:value-of select="count(WATER)" />)</h4> -->
            <xsl:apply-templates select="WATER"/>
        </div>
    </xsl:template>

    <!-- WATERS/WATER -->
    <xsl:template match="WATER">
        <div id="beerxml-water">
            <h5>WATER <xsl:value-of select="position()"/></h5>
            <table class="table table-sm table-bordered">

            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="AMOUNT"/></td></tr>
            <tr><td class="text-end">*CALCIUM</td><td><xsl:value-of disable-output-escaping="yes" select="CALCIUM"/></td></tr>
            <tr><td class="text-end">*BICARBONATE</td><td><xsl:value-of disable-output-escaping="yes" select="BICARBONATE"/></td></tr>
            <tr><td class="text-end">*SULFATE</td><td><xsl:value-of disable-output-escaping="yes" select="SULFATE"/></td></tr>
            <tr><td class="text-end">*CHLORIDE</td><td><xsl:value-of disable-output-escaping="yes" select="CHLORIDE"/></td></tr>
            <tr><td class="text-end">*SODIUM</td><td><xsl:value-of disable-output-escaping="yes" select="SODIUM"/></td></tr>
            <tr><td class="text-end">*MAGNESIUM</td><td><xsl:value-of disable-output-escaping="yes" select="MAGNESIUM"/></td></tr>

            <xsl:if test="string-length(PH)">
                <tr><td class="text-end">PH</td><td><xsl:value-of disable-output-escaping="yes" select="PH"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(NOTES)">
                <tr><td class="text-end">NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="NOTES"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(DISPLAY_AMOUNT)">
                <tr><td class="text-end">+DISPLAY_AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_AMOUNT"/></td></tr>
            </xsl:if>

            </table>
        </div>
    </xsl:template>

    <!-- MASH -->
    <xsl:template match="MASH">
        <div id="beerxml-mash">
            <!-- <h4>MASH</h4> -->
            <table class="table table-sm table-bordered">

            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*GRAIN_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="GRAIN_TEMP"/></td></tr>
            <tr><td class="text-end">*MASH_STEPS</td><td><xsl:value-of disable-output-escaping="yes" select="MASH_STEPS"/></td></tr>

            <xsl:if test="string-length(TUN_TEMP)">
                <tr><td class="text-end">TUN_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="TUN_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(SPARGE_TEMP)">
                <tr><td class="text-end">SPARGE_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="SPARGE_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(PH)">
                <tr><td class="text-end">PH</td><td><xsl:value-of disable-output-escaping="yes" select="PH"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TUN_WEIGHT)">
                <tr><td class="text-end">TUN_WEIGHT</td><td><xsl:value-of disable-output-escaping="yes" select="TUN_WEIGHT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(TUN_SPECIFIC_HEAT)">
                <tr><td class="text-end">TUN_SPECIFIC_HEAT</td><td><xsl:value-of disable-output-escaping="yes" select="TUN_SPECIFIC_HEAT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(EQUIP_ADJUST)">
                <tr><td class="text-end">EQUIP_ADJUST</td><td><xsl:value-of disable-output-escaping="yes" select="EQUIP_ADJUST"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(NOTES)">
                <tr><td class="text-end">NOTES</td><td><xsl:value-of disable-output-escaping="yes" select="NOTES"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(DISPLAY_GRAIN_TEMP)">
                <tr><td class="text-end">+DISPLAY_GRAIN_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_GRAIN_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TUN_TEMP)">
                <tr><td class="text-end">+DISPLAY_TUN_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TUN_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_SPARGE_TEMP)">
                <tr><td class="text-end">+DISPLAY_SPARGE_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_SPARGE_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_TUN_WEIGHT)">
                <tr><td class="text-end">+DISPLAY_TUN_WEIGHT</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_TUN_WEIGHT"/></td></tr>
            </xsl:if>

            </table>
            <xsl:apply-templates select="MASH_STEPS"/>
        </div>
    </xsl:template>

    <!-- MASH/MASH_STEPS -->
    <xsl:template match="MASH_STEPS">
        <div id="beerxml-mash-steps">
            <h4>MASH_STEPS (<xsl:value-of select="count(MASH_STEP)"/>)</h4>
            <xsl:apply-templates select="MASH_STEP"/>
        </div>
    </xsl:template>

    <!-- MASH/MASH_STEPS/MASH_STEP -->
    <xsl:template match="MASH_STEP">
        <div id="beerxml-mash-step">
            <h5>MASH_STEP <xsl:value-of select="position()"/></h5>
            <table class="table table-sm table-bordered">

            <tr><td class="text-end">*NAME</td><td><xsl:value-of disable-output-escaping="yes" select="NAME"/></td></tr>
            <tr><td class="text-end">*VERSION</td><td><xsl:value-of disable-output-escaping="yes" select="VERSION"/></td></tr>
            <tr><td class="text-end">*TYPE</td><td><xsl:value-of disable-output-escaping="yes" select="TYPE"/></td></tr>
            <tr><td class="text-end">*INFUSE_AMOUNT</td><td><xsl:value-of disable-output-escaping="yes" select="INFUSE_AMOUNT"/></td></tr>
            <tr><td class="text-end">*STEP_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="STEP_TEMP"/></td></tr>
            <tr><td class="text-end">*STEP_TIME</td><td><xsl:value-of disable-output-escaping="yes" select="STEP_TIME"/></td></tr>

            <xsl:if test="string-length(RAMP_TIME)">
                <tr><td class="text-end">RAMP_TIME</td><td><xsl:value-of disable-output-escaping="yes" select="RAMP_TIME"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(END_TEMP)">
                <tr><td class="text-end">END_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="END_TEMP"/></td></tr>
            </xsl:if>

            <xsl:if test="string-length(DESCRIPTION)">
                <tr><td class="text-end">+DESCRIPTION</td><td><xsl:value-of disable-output-escaping="yes" select="DESCRIPTION"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(WATER_GRAIN_RATIO)">
                <tr><td class="text-end">+WATER_GRAIN_RATIO</td><td><xsl:value-of disable-output-escaping="yes" select="WATER_GRAIN_RATIO"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DECOCTION_AMT)">
                <tr><td class="text-end">+DECOCTION_AMT</td><td><xsl:value-of disable-output-escaping="yes" select="DECOCTION_AMT"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(INFUSE_TEMP)">
                <tr><td class="text-end">+INFUSE_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="INFUSE_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_STEP_TEMP)">
                <tr><td class="text-end">+DISPLAY_STEP_TEMP</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_STEP_TEMP"/></td></tr>
            </xsl:if>
            <xsl:if test="string-length(DISPLAY_INFUSE_AMT)">
                <tr><td class="text-end">+DISPLAY_INFUSE_AMT</td><td><xsl:value-of disable-output-escaping="yes" select="DISPLAY_INFUSE_AMT"/></td></tr>
            </xsl:if>

            </table>
        </div>
    </xsl:template>

</xsl:stylesheet><!-- end beer.xsl -->