Эта таблица стилей:
<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>
Обратите внимание, что если вам нужен упрощенный синтаксис , из http://www.w3.org/TR/xslt#result-element-stylesheet:
Упрощенный синтаксис допускается для
таблицы стилей, которые состоят только из
один шаблон для корневого узла.
таблица стилей может состоять только из
элемент буквального результата (см. 7.1.1
Элементы буквального результата ). Такой
таблица стилей эквивалентна
таблица стилей с помощью xsl: stylesheet
элемент, содержащий шаблонное правило
содержащий буквальный элемент результата;
шаблонное правило имеет шаблон соответствия
/
.
Таким образом, вы можете добавлять элементы, но не можете удалять их.
EDIT : обратная логика для упрощенного синтаксиса.
Предположим, эта таблица стилей с ... 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>
Runnig с самим собой в качестве ввода (я подчеркиваю это с помощью 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>