<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://docbook.org/ns/docbook" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="d" version="1.0"> <!-- no separate HTML page with index as this is binary in hv1 --> <xsl:param name="generate.index" select="0"/> <!-- Generate help tags in header --> <xsl:template name="user.head.content"> <xsl:param name="node" select="''" /> <xsl:variable name="up" select="parent::*"/> <!-- Locale should be first Help tag--> <meta name="Microsoft.Help.Locale"> <xsl:attribute name="content"> <xsl:choose> <xsl:when test="$product.locale and product.locale != ''"> <xsl:value-of select="$product.locale"/> </xsl:when> <xsl:otherwise> <xsl:text>en-US</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:attribute> </meta> <!-- Specify locale for this chunk. Should probably query xml:lang --> <meta name="Microsoft.Help.TopicLocale"> <xsl:attribute name="content"> <xsl:choose> <xsl:when test="@xml:lang"> <xsl:value-of select="@xml:lang"/> </xsl:when> <xsl:when test="$product.locale and product.locale != ''"> <xsl:value-of select="$product.locale"/> </xsl:when> <xsl:otherwise> <xsl:text>en-US</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:attribute> </meta> <!-- This is the unique ID for this page --> <meta name="Microsoft.Help.Id"> <xsl:attribute name="content"> <xsl:call-template name="hv1.toc.id"/> </xsl:attribute> </meta> <!-- The ID of the parent TOC node (-1 is root) --> <meta name="Microsoft.Help.TocParent"> <xsl:attribute name="content"> <xsl:call-template name="hv1.toc.parent.id"> <xsl:with-param name="up" select="$up"/> </xsl:call-template> </xsl:attribute> </meta> <!-- For all pages with the same parent, the order is set by TocOrder --> <meta name="Microsoft.Help.TocOrder"> <xsl:attribute name="content"> <xsl:value-of select="1+count(preceding-sibling::chapter|preceding-sibling::section)"/> </xsl:attribute> </meta> <!-- boolean to indicate if this page is allowed to load custom branding --> <meta name="Microsoft.Help.SelfBranded"> <xsl:attribute name="content"> <xsl:choose> <xsl:when test="$topic.selfbrand"> <xsl:text>true</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>false</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:attribute> </meta> <!-- Insert description meta element. This is shown in searches and indexes --> <xsl:variable name="description"> <xsl:call-template name="hv1.description"/> </xsl:variable> <xsl:if test="$description != ''"> <meta name="Description"> <xsl:attribute name="content"> <xsl:call-template name="hv1.description"/> </xsl:attribute> </meta> </xsl:if> <!-- Display version of page --> <xsl:variable name="display.version"> <xsl:call-template name="hv1.display.version"/> </xsl:variable> <xsl:if test="$display.version != ''"> <meta name="Microsoft.Help.DisplayVersion"> <xsl:attribute name="content"> <xsl:value-of select="$display.version"/> </xsl:attribute> </meta> </xsl:if> <!-- Content type is used to distinguish between multiple topics with same id. Usualy to have multiple versions available --> <!-- <meta name="Microsoft.Help.ContentType"> <xsl:attribute name="content"> TODO: implement </xsl:attribute> </meta> --> <!-- If a product name is given, then mark each header with this name--> <xsl:if test="$product.name and $product.name != ''"> <meta name="Microsoft.Help.Product"> <xsl:attribute name="content"> <xsl:value-of select="$product.name"/> </xsl:attribute> </meta> </xsl:if> <!-- If a version is given, then mark each header with version--> <xsl:if test="$product.version and $product.version != ''"> <meta name="Microsoft.Help.ProductVersion"> <xsl:attribute name="content"> <xsl:value-of select="$product.version"/> </xsl:attribute> </meta> </xsl:if> <!-- Insert all keywords for this chunk. These are used by the help runtime to generate indexes and refine search --> <xsl:call-template name="hv1.keywords" /> <!-- Insert all F1 ids for this chunk. This is used by the help runtime to resolve F1 queries --> <xsl:call-template name="hv1.f1" /> </xsl:template> <!-- There are links from ToC pane to bibliodivs, so there must be anchor --> <xsl:template match="bibliodiv/title"> <h3 class="{name(.)}"> <xsl:call-template name="anchor"> <xsl:with-param name="node" select=".."/> <xsl:with-param name="conditional" select="0"/> </xsl:call-template> <xsl:apply-templates/> </h3> </xsl:template> <!-- Template to get a page id. Needs to be unique in the target help system; microsoft uses UUIDs for this. To avoid UUIDs and generate-id (only unique in current xml fragment), we do <root.filename> + <last ancestor title> + <second last ancestor title> + .... <self title>, where different types of sections/fragments may be prefixed with a type identifier. This should generate a fairly specific/unique ID. --> <xsl:template name="get.id.from.pagename"> <xsl:param name="target" /> <xsl:value-of select="$root.filename"/> <xsl:variable name="id.of.document"> <xsl:apply-templates select="$target" mode="recursive-chunk-id"/> </xsl:variable> <xsl:variable name="titleWithSpace"> <xsl:value-of select="key('id',$id.of.document)/title"/> </xsl:variable> <xsl:value-of select="translate($id.of.document,' ','')" /> </xsl:template> <!-- template that returns the page id used above --> <xsl:template match="*" mode="recursive-chunk-id"> <xsl:param name="recursive" select="false()"/> <!-- returns the filename of a chunk --> <xsl:variable name="ischunk"> <xsl:call-template name="chunk"/> </xsl:variable> <xsl:variable name="dbhtml-filename"> <xsl:call-template name="pi.dbhtml_filename"/> </xsl:variable> <xsl:variable name="filename"> <xsl:choose> <xsl:when test="$dbhtml-filename != ''"> <xsl:value-of select="$dbhtml-filename"/> </xsl:when> <!-- if this is the root element, use the root.filename --> <xsl:when test="not(parent::*) and $root.filename != ''"> <xsl:value-of select="$root.filename"/> <!-- <xsl:value-of select="$html.ext"/> --> </xsl:when> <!-- Special case --> <xsl:when test="self::legalnotice and not($generate.legalnotice.link = 0)"> <xsl:choose> <xsl:when test="(@id or @xml:id) and not($use.id.as.filename = 0)"> <!-- * if this legalnotice has an ID, then go ahead and use --> <!-- * just the value of that ID as the basename for the file --> <!-- * (that is, without prepending an "ln-" too it) --> <xsl:value-of select="(@id|@xml:id)[1]"/> <!-- <xsl:value-of select="$html.ext"/>--> </xsl:when> <xsl:otherwise> <!-- * otherwise, if this legalnotice does not have an ID, --> <!-- * then we generate an ID... --> <xsl:variable name="id"> <xsl:call-template name="object.id"/> </xsl:variable> <!-- * ...and then we take that generated ID, prepend an --> <!-- * "ln-" to it, and use that as the basename for the file --> <!-- <xsl:value-of select="concat('ln-',$id,$html.ext)"/>--> </xsl:otherwise> </xsl:choose> </xsl:when> <!-- if there's no dbhtml filename, and if we're to use IDs as --> <!-- filenames, then use the ID to generate the filename. --> <xsl:when test="(@id or @xml:id) and $use.id.as.filename != 0"> <xsl:value-of select="(@id|@xml:id)[1]"/> <!-- <xsl:value-of select="$html.ext"/>--> </xsl:when> <xsl:otherwise/> </xsl:choose> </xsl:variable> <xsl:choose> <xsl:when test="$ischunk='0'"> <!-- if called on something that isn't a chunk, walk up... --> <xsl:choose> <xsl:when test="count(parent::*)>0"> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="$recursive"/> </xsl:apply-templates> </xsl:when> <!-- unless there is no up, in which case return "" --> <xsl:otherwise/> </xsl:choose> </xsl:when> <xsl:when test="not($recursive) and $filename != ''"> <!-- if this chunk has an explicit name, use it --> <xsl:value-of select="$filename"/> </xsl:when> <xsl:when test="self::set"> <xsl:value-of select="$root.filename"/> </xsl:when> <xsl:when test="self::book"> <xsl:text>bk</xsl:text> <xsl:number level="any" format="01"/> </xsl:when> <xsl:when test="self::article"> <xsl:if test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:if> <xsl:text>ar</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::preface"> <xsl:if test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:if> <xsl:text>pr</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::chapter"> <xsl:if test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:if> <xsl:text>ch</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::appendix"> <xsl:if test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:if> <xsl:text>ap</xsl:text> <xsl:number level="any" format="a" from="book"/> </xsl:when> <xsl:when test="self::part"> <xsl:choose> <xsl:when test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> <xsl:text>pt</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::reference"> <xsl:choose> <xsl:when test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> <xsl:text>rn</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::refentry"> <xsl:choose> <xsl:when test="parent::reference"> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> <xsl:text>re</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::colophon"> <xsl:choose> <xsl:when test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> <xsl:text>co</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::sect1 or self::sect2 or self::sect3 or self::sect4 or self::sect5 or self::section"> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> <xsl:text>s</xsl:text> <xsl:number format="01"/> </xsl:when> <xsl:when test="self::bibliography"> <xsl:choose> <xsl:when test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> <xsl:text>bi</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::glossary"> <xsl:choose> <xsl:when test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> <xsl:text>go</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::index"> <xsl:choose> <xsl:when test="/set"> <!-- in a set, make sure we inherit the right book info... --> <xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> <xsl:with-param name="recursive" select="true()"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose> <xsl:text>ix</xsl:text> <xsl:number level="any" format="01" from="book"/> </xsl:when> <xsl:when test="self::setindex"> <xsl:text>si</xsl:text> <xsl:number level="any" format="01" from="set"/> </xsl:when> <xsl:otherwise> <xsl:text>chunk-filename-error-</xsl:text> <xsl:value-of select="name(.)"/> <xsl:number level="any" format="01" from="set"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- Main template that generates internal links --> <xsl:template name="href.target"> <xsl:param name="context" select="."/> <xsl:param name="object" select="."/> <xsl:param name="toc-context" select="."/> <xsl:variable name="id"> <xsl:call-template name="get.id.from.pagename"> <xsl:with-param name="target" select="$object"/> </xsl:call-template> </xsl:variable> <xsl:variable name="href"> <xsl:choose> <xsl:when test="$use.mshelp.links"> <!-- Generate a ms.help type link--> <xsl:if test="$product.name = ''"> <xsl:message terminate="yes"> $product.name needs to be set to generate ms.help style links </xsl:message> </xsl:if> <xsl:if test="$product.version = ''"> <xsl:message terminate="yes"> $product.version needs to be set to generate ms.help style links </xsl:message> </xsl:if> <xsl:if test="$product.locale = ''"> <xsl:message terminate="yes"> $product.locale needs to be set to generate ms.help style links </xsl:message> </xsl:if> <xsl:text>ms.help?method=page&id=</xsl:text> <xsl:value-of select="$id"/> <xsl:text>&product=</xsl:text> <xsl:value-of select="$product.name"/> <xsl:text>&productVersion=</xsl:text> <xsl:value-of select="$product.version"/> <xsl:text>&locale=</xsl:text> <xsl:value-of select="$product.locale"/> <!-- Append the jump id if the current object has an id--> <xsl:if test="$object[@id or @xml:id]"> <xsl:text>#</xsl:text> <xsl:value-of select="$object/@id|$object/@xml:id"/> </xsl:if> </xsl:when> <xsl:otherwise> <!-- Generate ms-xhelp type links. Default--> <xsl:text>ms-xhelp:///?Id=</xsl:text> <xsl:value-of select="$id"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:value-of select="$href"/> </xsl:template> <xsl:template match="*" mode="common.html.attributes"> <xsl:param name="class" select="local-name(.)"/> <xsl:param name="inherit" select="0"/> <!-- Workaround for known issue with HelpLibAgent Comment from Bruce Belson: <pre> tags get their whitespace mangled by the Help Library Agent, unless the non-standard attribute xml:space="preserve" is added to the pre element. --> <xsl:if test="$class = 'programlisting' or $class = 'verbatim' or $class = 'litterallayout' or $class = 'screen'"> <xsl:attribute name="xml:space">preserve</xsl:attribute> </xsl:if> <xsl:call-template name="generate.html.lang"/> <xsl:call-template name="dir"> <xsl:with-param name="inherit" select="$inherit"/> </xsl:call-template> <xsl:apply-templates select="." mode="class.attribute"> <xsl:with-param name="class" select="$class"/> </xsl:apply-templates> </xsl:template> <xsl:template name="hv1.display.version"> <xsl:apply-templates mode="title.markup" select="ancestor-or-self::book"/> <xsl:if test="ancestor-or-self::chapter"> <xsl:text> - </xsl:text> <xsl:apply-templates mode="title.markup" select="ancestor-or-self::chapter"/> </xsl:if> </xsl:template> <!-- Generate a meta element for each keyword in chunk --> <xsl:template name="hv1.keywords"> <xsl:variable name="is.chunk"> <xsl:call-template name="chunk"> <xsl:with-param name="node" select="."/> </xsl:call-template> </xsl:variable> <xsl:for-each select=".//indexterm[$is.chunk = '0'] | (./indexterm | *[not(self::section or self::preface or self::book or self::chapter)]//indexterm)[$is.chunk = '1']"> <xsl:choose> <xsl:when test="primary != ''"> <meta name="Microsoft.Help.Keywords"> <xsl:attribute name="content"> <xsl:choose> <!-- This concats the primary and secondary togheter, separated by colon if there exists a tertiary element --> <xsl:when test="tertiary"> <xsl:value-of select="primary/text()" /> <xsl:text>: </xsl:text> <xsl:value-of select="secondary/text()" /> <xsl:text>, </xsl:text> <xsl:value-of select="tertiary/text()" /> </xsl:when> <xsl:otherwise> <xsl:for-each select="primary/text() | secondary/text()"> <xsl:value-of select="." /> <xsl:if test="not(position() = last())">, </xsl:if> </xsl:for-each> </xsl:otherwise> </xsl:choose> </xsl:attribute> </meta> </xsl:when> <xsl:otherwise/> </xsl:choose> </xsl:for-each> </xsl:template> <!-- Generate a F1 meta element for each indexterm with an ID (used as F1 id) --> <xsl:template name="hv1.f1"> <xsl:variable name="is.chunk"> <xsl:call-template name="chunk"> <xsl:with-param name="node" select="."/> </xsl:call-template> </xsl:variable> <xsl:variable name="id"> <xsl:call-template name="hv1.toc.id"/> </xsl:variable> <xsl:for-each select=".//indexterm[$is.chunk = '0'] | (./indexterm | *[not(self::section or self::preface or self::book or self::chapter)]//indexterm)[$is.chunk = '1']"> <xsl:if test="@id|@xml:id"> <meta name="Microsoft.Help.F1"> <xsl:attribute name="content"> <xsl:value-of select="(@id|@xml:id)[1]" /> </xsl:attribute> </meta> </xsl:if> </xsl:for-each> </xsl:template> <!-- ID used for to resolution. Using default ID --> <xsl:template name="hv1.toc.id"> <xsl:variable name="href"> <xsl:call-template name="get.id.from.pagename"> <xsl:with-param name="target" select="."/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$href"/> </xsl:template> <!-- Determine parent id (if top level -> -1) --> <xsl:template name="hv1.toc.parent.id"> <xsl:param name="up" select="''"/> <xsl:variable name="href"> <xsl:choose> <xsl:when test="$up"> <!-- I have a parent --> <xsl:call-template name="get.id.from.pagename"> <xsl:with-param name="target" select="$up"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:text>-1</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:value-of select="$href"/> </xsl:template> <xsl:template name="hv1.description"> <xsl:variable name="content"> <xsl:choose> <xsl:when test="abstract|d:abstract|d:info/d:abstract|bookinfo/abstract|sectioninfo/abstract|articleinfo/abstract|partinfo/abstract"> <xsl:value-of select="(abstract|d:abstract|d:info/d:abstract|bookinfo/abstract|sectioninfo/abstract|articleinfo/abstract|partinfo/abstract)[1]"/> </xsl:when> <xsl:when test="child::para"> <xsl:value-of select="substring(normalize-space(child::para[1]), 0, 150)"/> </xsl:when> <xsl:otherwise/> </xsl:choose> </xsl:variable> <xsl:if test="$content != ''"> <xsl:value-of select="concat($content, '...')"/> </xsl:if> </xsl:template> </xsl:stylesheet>