这个样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="...">
<xsl:param name="PARAM_MODE" select="1"/>
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="my:sometag">
<xsl:if test="$PARAM_MODE!=1">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
<xsl:template match="my:sometag2">
<xsl:if test="$PARAM_MODE!=2">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
有了这个输入:
<root xmlns="...">
<!-- remove this element when PARAM_MODE=1 -->
<sometag />
<!-- remove this element when PARAM_MODE=2 -->
<sometag2 />
<someothertag />
</root>
输出:
<root xmlns="...">
<!-- remove this element when PARAM_MODE=1 -->
<!-- remove this element when PARAM_MODE=2 -->
<sometag2></sometag2>
<someothertag></someothertag>
</root>
请注意,如果你想有一个简化信达X,从http://www.w3.org/TR/xslt#result-element-stylesheet:
的简化语法允许 样式表仅由根节点一个 单个模板的。 样式表可能只包含一个 文字结果元素(请参阅7.1.1 Literal Result Elements)。这样的 样式表相当于 样式表,其中xsl:样式表 元素包含包含文字结果元素的模板规则 ; 模板规则具有/
的匹配模式 。
因此,您可以添加元素,但不能剥离它们。
编辑:用于简化语法的反转逻辑。
假设这个样式表与... test.xsl
URI:
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<root
xmlns="..."
xmlns:my="..."
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xsl:version="1.0">
<PARAM_MODE>1</PARAM_MODE>
<!-- remove this element when PARAM_MODE=1 -->
<xsl:if test="document('')/my:root/my:PARAM_MODE!=1">
<sometag />
</xsl:if>
<!-- remove this element when PARAM_MODE=2 -->
<xsl:if test="document('')/my:root/my:PARAM_MODE!=2">
<sometag2 />
</xsl:if>
<someothertag />
</root>
运行过程中出现以自己为输入(我用PI强调这也,这使得fn:document()
多余的......),输出:
<root xmlns="..." xmlns:my="...">
<PARAM_MODE>1</PARAM_MODE>
<sometag2 />
<someothertag />
</root>
最后的意见驱动的样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="PARAM_MODE" select="1"/>
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[preceding-sibling::node()[1]
/self::comment()[starts-with(.,' remove ')]]">
<xsl:if test="$PARAM_MODE != substring-after(
preceding-sibling::comment()[1],
'PARAM_MODE=')">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
输出:
<root xmlns="...">
<!-- remove this element when PARAM_MODE=1 -->
<!-- remove this element when PARAM_MODE=2 -->
<sometag2></sometag2>
<someothertag></someothertag>
</root>
1为工作答案和探索使用的隐含可能性简化的语法。我认为你表明他的要求“我希望将评论和XSL结合起来而不是重复”可能是不可能的。 – LarsH 2010-10-27 14:58:48
P.S.我在想,@Vitaly想根据评论的存在来剥离元素,而不是基于元素名称。但这并不完全清楚。 – LarsH 2010-10-27 15:04:32
@LarsH:我同意它不清楚。 'PARAM_MODE'也可以是一个元素。关于简化的语法:我不认为这是不可能的,因为你总是可以颠倒逻辑:'< - 删除该元素时PARAM_MODE = 1 - >的 < - 删除该元素时PARAM_MODE = 2 - >的 ' –
2010-10-27 15:30:09