Это мой первый раз, когда я что-то делаю с XSLT или XML, поэтому, пожалуйста, извините.Я обнаружил, что веб-документация XSLT действительно лаконична.
У меня есть файл XML, который я хочу обработать, чтобы выборочно отбрасывать контент на основе входного набора определений.Поведение должно быть аналогично простому препроцессору кода, обрабатывающему блоки ifdef.
Я разработал, как это сделать, как показано ниже, но некоторые части, такие как переменная "содержимого", не выглядят каклучший способ справиться с этим.
<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>
Основная проблема заключалась в применении шаблонов для случая, когда в определениях было найдено совпадение.Без содержимого я получаю документ с определениями, выгруженный в выходные данные в разной степени.
Каков наилучший способ предварительной обработки XML без преобразования?