Я хочу использовать атрибут @sourcename
для удобства следующим образом:
Если @sourcename
содержит точку, то часть до первой точки должна быть присвоена $srcgroup
, а часть после первой точки должна быть присвоена $srcword
.
В противном случае $srcgroup
должно быть установлено равным @sourcename
, а $srcword
должно быть пустой строкой.
В обоих случаях я хочу сделать одно и то же, используя $srcgroup
и $srcword
.
Я пробовал это со следующим фрагментом:
<xsl:choose>
<xsl:when test="contains(@sourcename, '.')">
<xsl:variable name="srcgroup" select="substring-before(@sourcename, '.')"/>
<xsl:variable name="srcword" select="substring-after(@sourcename, '.')" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="srcgroup" select="@sourcename" />
<xsl:variable name="srcword" />
</xsl:otherwise>
</xsl:choose>
<foo group="{$srcgroup}" word="{$srcword}" />
<!-- there's some other more complicated users of $srcgroup and $srcword -->
Проблема в том, что я получаю ошибку (это использование JAXP в Java):
ERROR: [my xsl file]: line 35: Variable or parameter 'srcgroup' is undefined.'
FATAL ERROR: 'Could not compile stylesheet'
Exception in thread "main" javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:825)
Если я правильно понимаю, я предполагаю, что переменные имеют область действия только для конкретного случая в блоке <xsl:choose>
. Есть ли способ обойти это? Я не хочу повторять мой другой код дважды.
p.s. Я нашел обходной путь:
<xsl:variable name="srcgroup" select="substring-before(concat(@sourcename, '.'), '.')" />
<xsl:variable name="srcword" select="substring-after(@sourcename, '.')" />
но я все еще хочу знать, как решить мой первоначальный вопрос, для дальнейшего использования.