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:
Burton Ale
*NAME |
English Pale Ale |
*VERSION |
1 |
*CATEGORY |
Bitter & English Pale Ale |
*CATEGORY_NUMBER |
1 |
*STYLE_LETTER |
A |
*STYLE_GUIDE |
BJCP 1999 |
*TYPE |
Ale |
*OG_MIN |
1.04300000 |
*OG_MAX |
1.06000000 |
*FG_MIN |
1.01000000 |
*FG_MAX |
1.02000000 |
*IBU_MIN |
20.0 |
*IBU_MAX |
40.0 |
*COLOR_MIN |
6.00000000 |
*COLOR_MAX |
12.00000000 |
CARB_MIN |
1.5 |
CARB_MAX |
2.4> |
ABV_MIN |
4.5 |
ABV_MAX |
5.5 |
PROFILE |
Medium to full body, with medium to high bitterness and hop aroma. Dry with a defined hop flavor. Golden to copper color. Crystal malt evident. Low carbonation for kegs, medium for bottled version. |
INGREDIENTS |
English malt. Crystal malt. English hops. Water with high Calcium Sulfate (gypsum) profile enhances bitterness perception (i.e. famous Burton-on-Trent Water) |
EXAMPLES |
Bass Pale Ale, Whitbread Pale Ale, Royal Oak |
NOTES |
Famous style from Burton-on-Trent. Stronger body than ordinary bitter, but slightly less bitter. A balanced, easy drinking beer that is malty and strong but not overbearing. |
+DISPLAY_OG_MIN |
1.043 SG |
+DISPLAY_OG_MAX |
1.060 SG |
+DISPLAY_FG_MIN |
1.010 SG |
+DISPLAY_FG_MAX |
1.020 SG |
+DISPLAY_COLOR_MIN |
6.0 SRM |
+DISPLAY_COLOR_MAX |
12.0 SRM |
+OG_RANGE |
1.043-1.060 SG |
+FG_RANGE |
1.010-1.020 SG |
+IBU_RANGE |
20.0-40.0 IBU |
+CARB_RANGE |
1.5-2.4 vols |
+COLOR_RANGE |
6.0-12.0 SRM |
+ABV_RANGE |
4.5-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.50 |
*AMOUNT |
0.0283500 |
*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 |
1.00 oz |
+INVENTORY |
1.00 oz |
+DISPLAY_TIME |
60 min |
HOP 2
*NAME |
Northern Brewer |
*VERSION |
1 |
*ALPHA |
7.50 |
*AMOUNT |
0.0141750 |
*USE |
Boil |
*TIME |
60.000 |
TYPE |
Both |
FORM |
Pellet |
BETA |
4.00 |
HSI |
35.0 |
ORIGIN |
Germany |
NOTES |
Also called Hallertauer Northern Brewers Use for: Bittering and finishing both ales and lagers of all kinds Aroma: Fine, dry, clean bittering hop. Unique flavor. Substitute: Hallertauer Mittelfrueh, Hallertauer Examples: Anchor Steam, Old Peculiar, |
+DISPLAY_AMOUNT |
0.50 oz |
+INVENTORY |
0.50 oz |
+DISPLAY_TIME |
60 min |
HOP 3
*NAME |
Fuggles |
*VERSION |
1 |
*ALPHA |
5.00 |
*AMOUNT |
0.0141750 |
*USE |
Boil |
*TIME |
2.000 |
TYPE |
Aroma |
FORM |
Pellet |
BETA |
2.00 |
HSI |
35.0 |
ORIGIN |
United Kingdom |
NOTES |
Used For: General purpose bittering/aroma for English Ales, Dark Lagers Aroma: Mild, soft, grassy, floral aroma Substitute: East Kent Goldings, Williamette Examples: Samuel Smith’s Pale Ale, Old Peculiar, Thomas Hardy’s Ale |
+DISPLAY_AMOUNT |
0.50 oz |
+INVENTORY |
0.50 oz |
+DISPLAY_TIME |
2 min |
HOP 4
*NAME |
Fuggles |
*VERSION |
1 |
*ALPHA |
4.50 |
*AMOUNT |
0.0212620 |
*USE |
Dry Hop |
*TIME |
4320.00 |
TYPE |
Aroma |
FORM |
Pellet |
BETA |
2.00 |
HSI |
35.0 |
ORIGIN |
United Kingdom |
NOTES |
Used For: General purpose bittering/aroma for English Ales, Dark Lagers Aroma: Mild, soft, grassy, floral aroma Substitute: East Kent Goldings, Williamette Examples: Samuel Smith’s Pale Ale, Old Peculiar, Thomas Hardy’s Ale |
+DISPLAY_AMOUNT |
0.75 oz |
+INVENTORY |
0.75 oz |
+DISPLAY_TIME |
3 days |
FERMENTABLE 1
*NAME |
Pale Malt (2 Row) UK |
*VERSION |
1 |
*TYPE |
Grain |
*AMOUNT |
3.628736 |
*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 |
8.00 lb |
+POTENTIAL |
1.036 |
+INVENTORY |
8.00 lb |
+DISPLAY_COLOR |
2.5 SRM |
FERMENTABLE 2
*NAME |
Caramel/Crystal Malt – 20L |
*VERSION |
1 |
*TYPE |
Grain |
*AMOUNT |
0.453592 |
*YIELD |
75.0 |
COLOR |
20.0 |
ADD_AFTER_BOIL |
FALSE |
ORIGIN |
US |
COARSE_FINE_DIFF |
1.5 |
MOISTURE |
4.0 |
DIASTATIC_POWER |
0.0 |
PROTEIN |
13.2 |
MAX_IN_BATCH |
20.0 |
RECOMMEND_MASH |
FALSE |
IBU_GAL_PER_LB |
0.000 |
NOTES |
Adds body, color and improves head retention. Also called “Crystal” malt. |
+DISPLAY_AMOUNT |
1.00 lb |
+POTENTIAL |
1.035 |
+INVENTORY |
1.00 lb |
+DISPLAY_COLOR |
20.0 SRM |
FERMENTABLE 3
*NAME |
Brown Sugar, Light |
*VERSION |
1 |
*TYPE |
Sugar |
*AMOUNT |
0.453592 |
*YIELD |
100.0 |
COLOR |
8.0 |
ADD_AFTER_BOIL |
FALSE |
ORIGIN |
US |
COARSE_FINE_DIFF |
– |
MOISTURE |
– |
DIASTATIC_POWER |
– |
PROTEIN |
– |
MAX_IN_BATCH |
10.0 |
RECOMMEND_MASH |
FALSE |
IBU_GAL_PER_LB |
0.000 |
NOTES |
Imparts a rich sweet flavor. Used in Scottish ales, holiday ales and some old ales. |
+DISPLAY_AMOUNT |
1.00 lb |
+POTENTIAL |
1.046 |
+INVENTORY |
1.00 lb |
+DISPLAY_COLOR |
8.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 |
Polyclar |
*VERSION |
1 |
*TYPE |
Fining |
*USE |
Secondary |
*TIME |
1440.000 |
*AMOUNT |
0.007393 |
AMOUNT_IS_WEIGHT |
FALSE |
USE_FOR |
Chill Haze |
NOTES |
Plastic powder that reduces chill haze by removing tannins and proteins. Add to secondary after yeast has settled. Amounts vary by manufacturer — check instructions before adding. Do not boil. |
+DISPLAY_AMOUNT |
0.25 oz |
+INVENTORY |
0.00 oz |
+DISPLAY_TIME |
1.0 days |
YEAST 1
*NAME |
Burton Ale |
*VERSION |
1 |
*TYPE |
Ale |
*FORM |
Liquid |
*AMOUNT |
0.0350130 |
AMOUNT_IS_WEIGHT |
FALSE |
LABORATORY |
White Labs |
PRODUCT_ID |
WLP023 |
MIN_TEMPERATURE |
20.0000 |
MAX_TEMPERATURE |
22.7778 |
FLOCCULATION |
Medium |
ATTENUATION |
72.0 |
BEST_FOR |
All English styles including Pale Ale, IPA, Porter, Stout and Bitters. |
TIMES_CULTURED |
0 |
MAX_REUSE |
5 |
ADD_TO_SECONDARY |
FALSE |
NOTES |
Burton-on-trent yeast produces a complex character. Flavors include apple, pear, and clover honey. |
+DISPLAY_AMOUNT |
35 ml |
+DISP_MIN_TEMP |
68.0 F |
+DISP_MAX_TEMP |
73.0 F |
+INVENTORY |
0 Pkgs |
+CULTURE_DATE |
7/6/2003 |
WATER 1
*NAME |
Burton On Trent, UK |
*VERSION |
1 |
*AMOUNT |
18.927168 |
*CALCIUM |
295.0 |
*BICARBONATE |
300.0 |
*SULFATE |
725.0 |
*CHLORIDE |
25.0 |
*SODIUM |
55.0 |
*MAGNESIUM |
45.0 |
PH |
8.0 |
NOTES |
Distinctive pale ales strongly hopped. Very hard water accentuates the hops flavor. Example: Bass Ale |
+DISPLAY_AMOUNT |
5.00 gal |
*NAME |
Single Infusion, Full Body |
*VERSION |
1 |
*GRAIN_TEMP |
22.22222200 |
*MASH_STEPS |
Mash In
1
Infusion
10.646532
45
70.00000000
2
70.00000000
Add 11.25 qt of water at 170.5 F
1.25
0.00 qt
170.5 F
DISPLAY_STEP_TEMP
11.25 qt
Mash Out
1
Infusion
6.813780
10
75.55555600
2
75.55555600
Add 7.20 qt of water at 185.9 F
2.05
0.00 qt
185.9 F
DISPLAY_STEP_TEMP
7.20 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 |
10.646532 |
*STEP_TEMP |
70.00000000 |
*STEP_TIME |
45 |
RAMP_TIME |
2 |
END_TEMP |
70.00000000 |
+DESCRIPTION |
Add 11.25 qt of water at 170.5 F |
+WATER_GRAIN_RATIO |
1.25 |
+DECOCTION_AMT |
0.00 qt |
+INFUSE_TEMP |
170.5 F |
+DISPLAY_STEP_TEMP |
DISPLAY_STEP_TEMP |
+DISPLAY_INFUSE_AMT |
11.25 qt |
MASH_STEP 2
*NAME |
Mash Out |
*VERSION |
1 |
*TYPE |
Infusion |
*INFUSE_AMOUNT |
6.813780 |
*STEP_TEMP |
75.55555600 |
*STEP_TIME |
10 |
RAMP_TIME |
2 |
END_TEMP |
75.55555600 |
+DESCRIPTION |
Add 7.20 qt of water at 185.9 F |
+WATER_GRAIN_RATIO |
2.05 |
+DECOCTION_AMT |
0.00 qt |
+INFUSE_TEMP |
185.9 F |
+DISPLAY_STEP_TEMP |
DISPLAY_STEP_TEMP |
+DISPLAY_INFUSE_AMT |
7.20 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 > $recipe_max or $recipe_idx = 'last'">
<xsl:value-of select="$recipe_max"/>
</xsl:when>
<xsl:when test="$recipe_idx > 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 -->