Один из способов сделать это будет:
<xsl:variable name="apos" select='"'"'/>
<!-- ... later ... -->
<xsl:for-each select="country[nation=concat('India', $apos, 's')]">
Проблема здесь двоякая:
- XSLT не определяет способ экранирования символов в строках. Так что
'India\'s'
не вариант.
- Вы должны пройти два разных уровня оценки.
Это:
- Правильная XML-форма : XML-документ, из которого состоит ваша XSLT-программа, должен быть правильно сформированным. Вы не можете нарушать правила XML.
- Синтаксический анализ выражения XSLT : Полученная строка значения атрибута (после синтаксического анализа XML DOM) должна иметь смысл для механизма XSLT.
Конструирует как:
<xsl:for-each select="country[nation='India's']">
<xsl:for-each select="country[nation='India's']">
пройти уровень XML, но нарушить уровень XSLT, потому что в обоих случаях эффективное значение атрибута (как хранится в DOM) равно country[nation='India's']
, что явно является синтаксической ошибкой XPath.
Конструирует как:
<xsl:for-each select="country[nation=concat('India', "'", 's')]">
<xsl:for-each select="country[nation=concat("India", "'", "s")]">
явно нарушает слой XML. Но они не будут нарушать слой XSLT (!), Поскольку их фактическое значение (, если документ XSLT может быть проанализирован в первую очередь ), будет выглядеть как country[nation=concat('India', "'", 's')]
, что совершенно законно как выражение XPath.
Таким образом, вы должны найти способ пройти как слой 1, так и слой 2. Один из них - переменный, как показано выше. Другой способ:
<xsl:for-each select="country[nation=concat('India', "'", 's')]">
, который для XSLT выглядит как country[nation=concat('India', "'", 's')]
.
Лично мне легче работать с "переменным способом".