2014-02-05 3 views
0

У меня есть XSL, как показано нижеXSL - использование переменных в NodePath

<xsl:variable name="foo" select="concat('some','stuff')" /> 

<xsl:if test="$foo"> 
    <xsl:element name="hello"> 
    <xsl:attribute name="id"> 
     <xsl:value-of select="-1"/> 
    </xsl:attribute> 

     <xsl:element name="region"> 
      <xsl:value-of select="$foo/child"/> <!-- foo is variable, but always has a 'child' node --> 
     </xsl:element> 

    </xsl:element> 
</xsl:if> 

Я получаю ниже результат:

<hello id="-1"> 

и исключение:

java.lang.ClassCastException : org.apache.xpath.objects.XString несовместим с org.apache.xpath.objects.XNodeSet

что я делаю неправильно?

+0

Я не думаю, что исключение исходит от вашего XSL. Покажите всю трассировку стека, а также ваш код Java, и четко обозначьте строку на Java, где выбрано исключение. Это основные требования к заданию вопросов об исключениях в StackOverflow. –

+0

Я могу получить узел на выходе, он терпит неудачу в точной строке '' – rgamber

+0

Просьба представить минимальный воспроизводимый пример: input XML и XSL. Что говорит Java: '$ foo' кажется строкой, а не узлом. Но вы можете выбирать только детей из узлов, а не из строк. –

ответ

1
<xsl:variable name="foo" select="concat('some','stuff')" /> 

будет создавать строку со значением «somestuff».

Строка получается ваша линия

<xsl:value-of select="$foo/child"/> 

эффективно в

<xsl:value-of select="'somestuff'/child"/> 

, который не является допустимым выражением XPath.

Строка thie не может использоваться в любых выражениях узлов, только в строковых операциях. Заменить

<xsl:variable name="foo" select="concat('some','stuff')" /> 

что-то вроде

<xsl:variable name="foo" select="./somestuff" /> 

, которая возвращает узел.

+0

Спасибо, это было то, что я искал. Тем не менее, все еще немного запутано. Есть ли способ, которым я могу использовать '. /' С 'concat '? – rgamber

+0

№ 'concat' всегда будет создавать строку. Если вы действительно хотите что-то сделать, вам нужно что-то вроде 'select =" // * [local-name() = concat ('some', 'stuff')] "/>', но я ' d рекомендуем найти более простой подход. –

+0

Вижу, да. Спасибо за помощь! – rgamber

Смежные вопросы