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:
Dry Stout
*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 > $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 -->