У меня есть блок XSLT, который может быть применен несколько раз в течение преобразования. Но я хочу, чтобы он действительно запускался только при первом применении, он должен быть пропущен все последующие времена. Как мне это сделать?
В качестве примера, вот что я хочу сделать:
В таблице стилей я определяю глобальную переменную:
<xsl:variable name="run_once" select="0"/>
Тогда у меня есть шаблон, который вызывается несколько раз:
<xsl:template name="some_template">
<xsl:if test="$run_once != 1">
<xsl:variable name="run_once" select="1"/>
<xsl:text>THIS TEXT SHOULD APPEAR ONLY ONCE</xsl:text>
</xsl:if>
</xsl:template>
Конечно, это не работает, потому что переменные не могут быть изменены, только перегружены. Таким образом, после выхода some_template $ run_once снова становится равным 0, и текст применяется каждый раз, когда вызывается шаблон.
Могу ли я установить какой-либо тип функциональности ifdef или другой глобальный объект?
Если вас интересует, почему я хочу это сделать, ниже приведено более подробное объяснение моей проблемы и решения, которое я использовал:
- Мои данные - это данные в формате XML,
вывод представляет собой отчет в формате WordML.
- На входе у меня есть ряд узлов
(названный theNode ). Некоторые, но не
все эти узлы должны быть
отображается на выходе. Узел
должен отображаться только если XPATH
hairyLogic верно (hairyLogic явно длинный и
комплекс).
- Узел также имеет тип (хранится в
подузел). На входе все
Узлы того же типа будут
всегда быть сгруппированы вместе. в
вывод, все узлы одного и того же
тип должен быть сгруппирован под
конкретный заголовок для этого типа (там
должен быть только один заголовок для каждого
типа).
Это решение, которое я использовал в итоге:
...
<xsl:apply-templates select="theNode[hairyLogic]"/>
...
<xsl:template match="theNode">
<xsl:if test="count(preceding-sibling::theNode[type = current()/type and hairyLogic])=0">
<xsl:choose>
<xsl:when test="type = 'TYPE1a' or type = 'TYPE1b'">
<xsl:call-template name="TYPE1Heading"/>
</xsl:when>
<xsl:when test="type = 'TYPE2'">
<xsl:call-template name="TYPE2Heading"/>
</xsl:when>
</xsl:choose>
</xsl:if>
...
</xsl:template>
Я решил использовать именованные шаблоны для заголовков, поскольку они содержат базовый WordML, который не зависит от каких-либо данных во входном XML.
Мне не нравится это решение, потому что hairyLogic повторяется, а оператор if сложен и труден для чтения. Может быть, у вас есть лучшее решение, которое не требует изменяемых переменных?