I would like to match the first occurance of a specific node value and i am stumped.
I have tried <xsl:when test="root/content/contentType = root/content/contentType[.='generic'][1]"> but it matches every occurance, as does <xsl:when test="root/content/contentType[.='generic'][1]">
I would like to end up with the output HTML below. The first item has a header but every item has a class of the same value.
Here is my XML.
Any ideas are very much appreciated.
XML:
<root>
<content>
<contentType>ingredients</contentType>
<listItems>
<item>Item 1</item>
<item>Item 2</item>
</listItems>
</content>
<content>
<contentType>generic</contentType>
<listItems>
<item>Item 1</item>
<item>Item 2</item>
</listItems>
</content>
<content>
<contentType>generic</contentType>
<listItems>
<item>Item 1</item>
<item>Item 2</item>
</listItems>
</content>
<content>
<contentType>ingredients</contentType>
<listItems>
<item>Item 1</item>
<item>Item 2</item>
</listItems>
</content>
<content>
<contentType>directions</contentType>
<listItems>
<item>Item 1</item>
<item>Item 2</item>
</listItems>
</content>
</root>
Desired Output:
<div class="ingredients">
<h2>Ingredients</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</div>
<div class="generic">
<h2>Generic</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</div>
<div class="generic">
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</div>
<div class="ingredients">
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</div>
<div class="directions">
<h2>Directions</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</div>
EDIT:
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<xsl:for-each select="root/content">
<div>
<xsl:attribute name="class"><xsl:value-of select="./contentType"/></xsl:attribute>
<xsl:choose>
<xsl:when test="./contentType[.='ingredients'][1]">
<h2><xsl:value-of select="./contentType"/></h2>
</xsl:when>
<xsl:when test="./contentType[.='generic'][1]">
<h2><xsl:value-of select="./contentType"/></h2>
</xsl:when>
<xsl:when test="./contentType[.='directions'][1]">
<h2><xsl:value-of select="./contentType"/></h2>
</xsl:when>
</xsl:choose>
<ul>
<xsl:for-each select="listItems/item">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
How about this:
This might be a bit cleaner:
One discrepancy here is that your desired output has the h2 values capitalized, while they will not be in this case. Were you aware of that?
I think the good practice would be to have the classes and titles as separate values in the source XML, but if you really want to use the same value in both places, you can capitalize the first letter by doing this: