这大概是使用 XSLT 作为 XML 预处理器的几乎复本但是由于该问题的 OP 没有发布完整的示例,尽管被要求,回复对任何不熟悉 XSLT 的人都没有用。广泛的网络搜索也没有发现任何有用的东西——XSLT 似乎记录得非常少,并且在网络上很少讨论。
反正 ...
我有一个 XML 文件,比如 foo.xml,如下(显然,大大简化了):
<?xml version="1.0" encoding="UTF-8"?>
<main>
<fee>blah</fee>
<ifdef select="OLD_VERSION">
<fi>blah blah</fi>
</ifdef>
</main>
(根据 Ian Roberts 的回答,C 风格的 #ifdef 更改为“ifdef”块)
我想在linux上运行一个xsltproc命令,如下:
xsltproc --stringparam xmlver NEW_VERSION --nonet foo.xslt foo.xml
并使用以下 XSLT 文件 foo.xslt 排除 #ifdef'ed 部分:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:param name="xmlver" required="yes"/>
<xsl:template match="node() | @*">
<xsl:copy><xsl:apply-templates select="node() | @*"/></xsl:copy>
</xsl:template>
<xsl:variable name="defines" select="document($xmlver)/defines"/>
<xsl:template match="ifdef">
<xsl:variable name="this" select="."/>
<xsl:for-each select="$defines[def = $this/@select]">
<xsl:apply-templates select="$this/node()" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
(我确实使用对上面提到的问题的答复来构建这个 XSLT;但缺少的成分是在哪里/如何合并“xmlver”值。当然不能保证它在上面是正确的;但这基本上是我我在问 - 所有这些是如何以一种有效的方式组合在一起的?)
任何建设性的答复将不胜感激,并且无疑会对将来有类似要求的许多人有用;但请不要烦人,教条“你为什么要这样做?” 回复!