В XSLT 2.0 (XPath 2.0) для этой цели могут использоваться функции static-base-uri()
и base-uri()
.
Вот рабочий пример:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<doc xml:base="{base-uri()}"/>
</xsl:template>
</xsl:stylesheet>
, когда применяется это преобразование, желаемый результат получается :
<doc xml:base="file:/C:/CVS-DDN/fxsl-xslt2/data/marrowtr.xml"/>
Итак, полное преобразование в вашем случае: :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:d="http://docbook.org/ns/docbook">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/d:section">
<xsl:copy>
<xsl:attribute name="xml:base" select="base-uri(/)"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
В XSLT 1.0 решением является для передачи base-uri в качестве внешнего параметра (global xsl:param>
) к трансформации.