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:
Porter
*NAME |
Robust Porter |
*VERSION |
1 |
*CATEGORY |
Porter |
*CATEGORY_NUMBER |
15 |
*STYLE_LETTER |
A |
*STYLE_GUIDE |
BJCP 1999 |
*TYPE |
Ale |
*OG_MIN |
1.05000000 |
*OG_MAX |
1.06500000 |
*FG_MIN |
1.01200000 |
*FG_MAX |
1.01600000 |
*IBU_MIN |
25.0 |
*IBU_MAX |
45.0 |
*COLOR_MIN |
30.00000000 |
*COLOR_MAX |
60.00000000 |
CARB_MIN |
1.8 |
CARB_MAX |
2.5> |
ABV_MIN |
4.8 |
ABV_MAX |
6.0 |
PROFILE |
Medium to full body, slightly dry. Well balanced, low to medium malt flavor and hop bitterness. Dark brown to black color. Medium to no hop flavor. Low ester, fruitiness, diacytl. Low to med carbonation. |
INGREDIENTS |
English malt. Dark Crystal, chocolate and black or roast malt. Traditional english ale hops and yeast. Moderate carbonate water. |
EXAMPLES |
Sierra Nevada Porter, Anchor Porter |
NOTES |
Stronger, darker version of porter with a slight dryness. Flavor derived from chocolate and black malts, but lacks the strong roasted flavor of a dry stout. |
+DISPLAY_OG_MIN |
1.050 SG |
+DISPLAY_OG_MAX |
1.065 SG |
+DISPLAY_FG_MIN |
1.012 SG |
+DISPLAY_FG_MAX |
1.016 SG |
+DISPLAY_COLOR_MIN |
30.0 SRM |
+DISPLAY_COLOR_MAX |
60.0 SRM |
+OG_RANGE |
1.050-1.065 SG |
+FG_RANGE |
1.012-1.016 SG |
+IBU_RANGE |
25.0-45.0 IBU |
+CARB_RANGE |
1.8-2.5 vols |
+COLOR_RANGE |
30.0-60.0 SRM |
+ABV_RANGE |
4.8-6.0 % |
*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 |
Fuggles |
*VERSION |
1 |
*ALPHA |
4.50 |
*AMOUNT |
0.0566990 |
*USE |
Boil |
*TIME |
60.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 |
2.00 oz |
+INVENTORY |
2.00 oz |
+DISPLAY_TIME |
60 min |
FERMENTABLE 1
*NAME |
Pale Malt (2 Row) Bel |
*VERSION |
1 |
*TYPE |
Grain |
*AMOUNT |
3.628736 |
*YIELD |
80.0 |
COLOR |
3.2 |
ADD_AFTER_BOIL |
FALSE |
ORIGIN |
Belgium |
COARSE_FINE_DIFF |
1.5 |
MOISTURE |
4.0 |
DIASTATIC_POWER |
60.0 |
PROTEIN |
10.5 |
MAX_IN_BATCH |
100.0 |
RECOMMEND_MASH |
FALSE |
IBU_GAL_PER_LB |
0.000 |
NOTES |
Base malt for all beer styles Higher potential yield than US, English equivalent pale ale malts |
+DISPLAY_AMOUNT |
8.00 lb |
+POTENTIAL |
1.037 |
+INVENTORY |
8.00 lb |
+DISPLAY_COLOR |
3.2 SRM |
FERMENTABLE 2
*NAME |
Black (Patent) Malt |
*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 |
6.0 |
DIASTATIC_POWER |
0.0 |
PROTEIN |
13.2 |
MAX_IN_BATCH |
10.0 |
RECOMMEND_MASH |
FALSE |
IBU_GAL_PER_LB |
0.000 |
NOTES |
Dark color and dry roasted flavor characteristic of Stouts and Porters Use for: Coloring in small amounts, or flavoring of Stouts and Porters in larger amounts. |
+DISPLAY_AMOUNT |
1.00 lb |
+POTENTIAL |
1.025 |
+INVENTORY |
1.00 lb |
+DISPLAY_COLOR |
500.0 SRM |
FERMENTABLE 3
*NAME |
Caramel/Crystal Malt – 10L |
*VERSION |
1 |
*TYPE |
Grain |
*AMOUNT |
0.453592 |
*YIELD |
75.0 |
COLOR |
10.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 |
10.0 SRM |
FERMENTABLE 4
*NAME |
Chocolate Malt |
*VERSION |
1 |
*TYPE |
Grain |
*AMOUNT |
0.226796 |
*YIELD |
60.0 |
COLOR |
350.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 |
10.0 |
RECOMMEND_MASH |
FALSE |
IBU_GAL_PER_LB |
0.000 |
NOTES |
Dark malt that gives a rich red or brown color and nutty flavor. Use for: Brown ales, porters, some stouts Maintains some malty flavor, not as dark as roasted malt. |
+DISPLAY_AMOUNT |
0.50 lb |
+POTENTIAL |
1.028 |
+INVENTORY |
0.50 lb |
+DISPLAY_COLOR |
350.0 SRM |
FERMENTABLE 5
*NAME |
Munich Malt – 10L |
*VERSION |
1 |
*TYPE |
Grain |
*AMOUNT |
0.226796 |
*YIELD |
77.0 |
COLOR |
10.0 |
ADD_AFTER_BOIL |
FALSE |
ORIGIN |
US |
COARSE_FINE_DIFF |
2.8 |
MOISTURE |
5.0 |
DIASTATIC_POWER |
50.0 |
PROTEIN |
13.5 |
MAX_IN_BATCH |
80.0 |
RECOMMEND_MASH |
FALSE |
IBU_GAL_PER_LB |
0.000 |
NOTES |
Malty-sweet flavor characteristic and adds a slight orange color to the beer. Does not contribute signficantly to body or head retention. Use for: Bock, Porter, Marzen, Oktoberfest beers |
+DISPLAY_AMOUNT |
0.50 lb |
+POTENTIAL |
1.035 |
+INVENTORY |
0.50 lb |
+DISPLAY_COLOR |
10.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 |
English Ale |
*VERSION |
1 |
*TYPE |
Ale |
*FORM |
Liquid |
*AMOUNT |
0.0350130 |
AMOUNT_IS_WEIGHT |
FALSE |
LABORATORY |
White Labs |
PRODUCT_ID |
WLP002 |
MIN_TEMPERATURE |
18.3333 |
MAX_TEMPERATURE |
20.0000 |
FLOCCULATION |
Very High |
ATTENUATION |
66.5 |
BEST_FOR |
English Pale Ale, ESB, India Pale Ale, Brown Ale, Porter, Sweet Stouts and Strong Ales |
TIMES_CULTURED |
0 |
MAX_REUSE |
5 |
ADD_TO_SECONDARY |
FALSE |
NOTES |
Classic ESB strain best for English style milds, bitters, porters and English style stouts. Leaves a clear beer with some residual sweetness. |
+DISPLAY_AMOUNT |
35 ml |
+DISP_MIN_TEMP |
65.0 F |
+DISP_MAX_TEMP |
68.0 F |
+INVENTORY |
0 Pkgs |
+CULTURE_DATE |
7/6/2003 |
*NAME |
Single Infusion, Medium Body |
*VERSION |
1 |
*GRAIN_TEMP |
22.22222200 |
*MASH_STEPS |
Mash In
1
Infusion
13.012428
60
67.77777800
2
67.77777800
Add 13.75 qt of water at 165.9 F
1.25
0.00 qt
165.9 F
DISPLAY_STEP_TEMP
13.75 qt
Mash Out
1
Infusion
8.327954
10
75.55555600
2
75.55555600
Add 8.80 qt of water at 193.1 F
2.05
0.00 qt
193.1 F
DISPLAY_STEP_TEMP
8.80 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 |
13.012428 |
*STEP_TEMP |
67.77777800 |
*STEP_TIME |
60 |
RAMP_TIME |
2 |
END_TEMP |
67.77777800 |
+DESCRIPTION |
Add 13.75 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 |
13.75 qt |
MASH_STEP 2
*NAME |
Mash Out |
*VERSION |
1 |
*TYPE |
Infusion |
*INFUSE_AMOUNT |
8.327954 |
*STEP_TEMP |
75.55555600 |
*STEP_TIME |
10 |
RAMP_TIME |
2 |
END_TEMP |
75.55555600 |
+DESCRIPTION |
Add 8.80 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 |
8.80 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 -->