2013-12-06 3 views
1

Я построил шаблон схемы и обнаружил непредвиденную ошибку.XPath/Schematron эквивалент «xsl: value-of»

Я попытался соединить строку (например, «Robinson 1983») с выходом функции xsl. Моя функция работает как этот

<xsl:value-of select="surname"/><xsl:text> </xsl:text><xsl:value-of select="year"/> 

Так, в Schematron

test="'Robinson 1983' = ...function-call..." 

вернула «ложь», потому что выход функции является последовательность, состоящая из трех элементов текста.

я был в состоянии исправить это с помощью XSLT

<xsl:variable name="output"><xsl:value-of select="...function-call..."/></xsl:variable> 

и

test="'Robinson 1983' = $output" 

вернул "истинный", как и ожидалось.

Но мне интересно: как это решить в «чистом» Schematron/XPath? Есть ли какой-либо эквивалент xsl: value-of? То есть превращая последовательность в строку, избавляясь от другого содержимого. Я думаю, что это одна из самых важных вещей, которые вы хотите сделать в XPath, но я не нашел решения.

+1

Существует ['fn: string-join()'] (http://www.w3.org/TR/xpath-functions/#func-string-join). Или просто используйте 'concat (фамилия, год, год)' прямо сейчас. – Tomalak

ответ

0

Я попытался воссоздать ваш пример, но он отлично работал для меня так же, как вы его сначала закодировали.

Я подозреваю, что функция с помощью первого оператора выбора:

<xsl:value-of select="surname"/><xsl:text> </xsl:text><xsl:value-of select="year"/> 

возвращает эти объединенные значения в виде одной строки, но ваши данные могут фактически содержать несколько наборов (год фамилия) строк.

Возможно ли, что ваши данные содержат несколько наборов строк (фамилия года)? Возможно, ваша функция непреднамеренно возвращает больше, чем одна за раз.

+0

Спасибо за ответы! Я попробовал concat (... function-call ...), но он дал ошибку «Concat не может быть вызван с одним аргументом», похоже, здесь не работает. Мистер Мохр, честно говоря, я не понимаю. Конечно, в моих данных имеется более одной строчки фамилии и более одного года. Но цель этой функции состоит в том, чтобы выбрать нужную и, похоже, хорошо работать. Infact, я получаю «Robinson 1983», а не «RobinsonMiller 19832010», поэтому я не думаю, что проблема здесь. Но, скорее всего, я этого не понял. – cis

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