chcę użyć atrybutu @sourcename
w następujący sposób, jako udogodnienie:XSLT: przypisanie zmienne równe jednemu z dwóch przypadkach
Jeśli @sourcename
ma kropkę w nim, część przed pierwszą kropką należy przypisać do $srcgroup
, a część po pierwszej kropce powinna być przypisana do $srcword
.
W przeciwnym razie $srcgroup
powinno być ustawione na równe @sourcename
, a $srcword
powinno być pustym ciągiem.
W obu przypadkach chcę zrobić to samo, używając $srcgroup
i $srcword
.
Próbowałem to z następującego fragmentu:
<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 -->
Problem polega na tym, że pojawia się błąd (to jest przy użyciu JAXP w Javie):
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)
Jeśli dobrze rozumiem to prawo, I” Zgaduję, że zmienne mają tylko zakres konkretnego przypadku w bloku <xsl:choose>
. Czy istnieje sposób na obejście tego? Nie chcę powtarzać drugiego kodu dwukrotnie.
p.s. Znalazłem obejście:
<xsl:variable name="srcgroup" select="substring-before(concat(@sourcename, '.'), '.')" />
<xsl:variable name="srcword" select="substring-after(@sourcename, '.')" />
, ale nadal chcę wiedzieć, jak rozwiązać moje oryginalne pytanie, na przyszłość.
Jeśli przeczytasz mój komentarz na końcu mojego posta, zobaczysz, że to wymyśliłem ... to jest pomocne w obsłudze tego konkretnego przypadku, ale nie odpowiada mi na pytanie, jak warunkowo przypisać zmienną. –
Nawiasem mówiąc, masz błąd - nie powinieneś używać concata w przypadku 'substring-after', ponieważ tworzy on dodatkową kropkę na końcu' srcword' w niepustym przypadku. –
@JasonS: Poprawiłem moją odpowiedź. I tak, dokładnie odpowiada na pytanie, jak warunkowo zdefiniować zmienną. Jak widać, żadne warunki nie są konieczne do zdefiniowania zmiennych w pożądany sposób. –