Ответ 1
В XSLT 1.0 существует способ (нестандартный) динамически создавать временные деревья и оценивать выражения XPath на них , однако для этого требуется использовать функцию xxx:node-set()
.
Каждый раз, когда узлы динамически создаются внутри тела xsl:variable
или xsl:param
, типом xsl:variable
/xsl:param
является RTF (фрагмент дерева результатов) и W3 XSLT 1.0 Spec. полностью ограничивает вид выражений XPath, которые можно оценить с помощью RTF.
В качестве обходного решения почти каждый поставщик XSLT 1.0 имеет собственную функцию xxx:node-set()
extension, которая принимает RTF и создает из нее обычный node.
Пространство имен, к которому привязан префикс xxx
(или любой другой префикс), для разных поставщиков отличается. Для MSXML и двух процессоров .NET XSLT это: "urn:schemas-microsoft-com:xslt"
. Библиотека EXSLT использует пространство имен: "http://exslt.org/common"
. Это пространство имен EXSLT реализовано на многих процессорах XSLT 1.0, и рекомендуется использовать расширение xxx:node-set()
, если это возможно.
Вот краткий пример:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:ext="http://exslt.org/common"
exclude-result-prefixes="ext msxsl"
>
<xsl:template match="/">
<xsl:variable name="vTempRTF">
<a>
<b/>
</a>
</xsl:variable>
<xsl:copy-of select="ext:node-set($vTempRTF)/a/*"/>
</xsl:template>
</xsl:stylesheet>