Я думаю, что вы нашли ошибку, но основной причиной ошибки (или вашей трудности в ее решении) является неспособность объявить типы ваших переменных и параметров. Если бы вы следовали правилу, согласно которому параметры и результаты функций всегда должны иметь объявленный тип, то вы бы спросили себя, какое значение принимает функция и что она возвращает, и вы, вероятно, решили бы, что оба ввода и вывода являются строками , ведущий к объявлению:
<xsl:function name="ns:set_value" as="xs:string">
<xsl:param name="givenDate" as="xs:string"/>
С этими объявлениями компилятор сможет прямо сказать вам, что не так. $givenDate/text()
не имеет смысла, потому что строка не имеет дочерних текстовых узлов; и возвращаемое значение
<xsl:text>"</xsl:text>
<xsl:value-of select="$givenDate"/>
<xsl:text>"</xsl:text>
не имеет смысла, потому что последовательность текстовых узлов не может быть преобразована в строку. Самый простой и прямой способ вернуть строковый результат - это, вероятно,
хотя, если вы хотите избежать возни с экранированными кавычками, альтернативой будет редко встречающийся
<xsl:value-of>
<xsl:text>"</xsl:text>
<xsl:value-of select="$givenDate"/>
<xsl:text>"</xsl:text>
</xsl:value-of>
, который объединяет три текстовых узла в один (и объявление типа as = "xs: string" затем вызывает неявное преобразование текстового узла в строку. Вы также можете сократить его до
<xsl:value-of>"<xsl:value-of select="$givenDate"/>"</xsl:value-of>
Или в XSLT 3.0, с expand-text="yes"
вы можете использовать шаблон текстового значения:
<xsl:value-of>"{$givenDate}"</xsl:value-of>