【发布时间】:2011-08-26 22:54:36
【问题描述】:
这是我第一次用 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 进行预处理的最佳方法是什么?
【问题讨论】:
-
一个示例 XML 文档和预期的输出会很有帮助。
标签: xml xslt preprocessor