This is my first time doing anything with XSLT, or XML really, so please excuse me. I've found XSLT web documentation is really terse.
I have an XML file that I want to process to selectively drop content based on an input set of defines. The behavior should be similar to a simple code pre-processor handling ifdef blocks.
I've worked out how to do it as below, but some parts such as the "contents" variable didn't seem like the best way to handle this.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:param name="defines-uri" required="yes"/>
<xsl:template match="* | @*">
<xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates/></xsl:copy>
</xsl:template>
<xsl:template match="ifdef">
<xsl:variable name="contents" select="child::node()"/>
<xsl:variable name="defines" select="document($defines-uri)/defines"/>
<xsl:variable name="val" select="@select"/>
<xsl:for-each select="$defines">
<xsl:if test="def=$val">
<xsl:apply-templates select="$contents"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
The main issue was the apply-templates on the case when a match was found in the defines. Without the contents, I get the defines document dumped to different degrees in the output.
Whats the best way to do pre-processing of XML without transformation?