Index: /trunk/doc/manual/Makefile.kmk
===================================================================
--- /trunk/doc/manual/Makefile.kmk	(revision 56539)
+++ /trunk/doc/manual/Makefile.kmk	(revision 56540)
@@ -680,5 +680,5 @@
 $(VBOX_MANUAL_APIREF_TMP): $(VBOX_PATH_MANUAL_SRC)/xidl2docbook.xsl $(VBOX_DOC_XIDL_SRC_TMP)
 	$(call MSG_L1,Generating $@)
-	$(QUIET)$(VBOX_XSLTPROC) --xinclude --nonet -o $@ $< $(VBOX_DOC_XIDL_SRC_TMP)
+	$(QUIET)$(VBOX_XSLTPROC) $(VBOX_XSLTPROC_OPTS) --xinclude --nonet -o $@ $< $(VBOX_DOC_XIDL_SRC_TMP)
 
 $(VBOX_PATH_MANUAL_OUTBASE)/en_US/SDKRef.xml: $(VBOX_PATH_MANUAL_SRC)/en_US/SDKRef.xml $(VBOX_MANUAL_APIREF_TMP)
Index: /trunk/doc/manual/xidl2docbook.xsl
===================================================================
--- /trunk/doc/manual/xidl2docbook.xsl	(revision 56539)
+++ /trunk/doc/manual/xidl2docbook.xsl	(revision 56540)
@@ -31,4 +31,12 @@
   <xsl:strip-space elements="*"/>
 
+ <!-- - - - - - - - - - - - - - - - - - - - - - -
+  Keys for more efficiently looking up of types.
+ - - - - - - - - - - - - - - - - - - - - - - -->
+
+<xsl:key name="G_keyEnumsByName"        match="//enum[@name]"       use="@name"/>
+<xsl:key name="G_keyInterfacesByName"   match="//interface[@name]"  use="@name"/>
+<xsl:key name="G_keyResultsByName"      match="//result[@name]"     use="@name"/>
+
 <!-- - - - - - - - - - - - - - - - - - - - - - -
   global XSLT variables
@@ -53,5 +61,5 @@
     <xsl:when test="$type">
       <xsl:choose>
-        <xsl:when test="//interface[@name=$type]">
+        <xsl:when test="count(key('G_keyInterfacesByName',$type)) > 0">
           <link>
             <xsl:attribute name="linkend">
@@ -61,5 +69,5 @@
           </link>
         </xsl:when>
-        <xsl:when test="//enum[@name=$type]">
+        <xsl:when test="count(key('G_keyEnumsByName',$type)) > 0">
           <link>
             <xsl:attribute name="linkend">
@@ -425,9 +433,9 @@
     </xsl:variable>
     <xsl:choose>
-      <xsl:when test="//interface[@name=$tmp] or //enum[@name=$tmp]"><!-- link to interface only -->
+      <xsl:when test="count(key('G_keyInterfacesByName',$tmp)) > 0 or count(key('G_keyEnumsByName',$tmp)) > 0"><!-- link to interface only -->
         <xsl:attribute name="linkend"><xsl:value-of select="@to" /></xsl:attribute>
         <xsl:value-of select="$tmp" />
       </xsl:when>
-      <xsl:when test="//enum[@name=$enumNameFromCombinedName]">
+      <xsl:when test="count(key('G_keyEnumsByName',$enumNameFromCombinedName)) > 0">
         <xsl:attribute name="linkend">
           <xsl:value-of select="concat($enumNameFromCombinedName, '__', $enumValueFromCombinedName)" />
@@ -464,17 +472,14 @@
           <xsl:choose>
             <!-- if link points to a method, append "()" -->
-            <xsl:when test="//interface[@name=$if]/method[@name=$member]">
+            <xsl:when test="key('G_keyInterfacesByName',$if)/method[@name=$member]">
               <xsl:value-of select="'()'" />
             </xsl:when>
             <!-- if link points to a safearray attribute, append "[]" -->
-            <xsl:when test="//interface[@name=$if]/attribute[@name=$member]/@safearray = 'yes'">
+            <xsl:when test="key('G_keyInterfacesByName',$if)/attribute[@name=$member]/@safearray = 'yes'">
               <xsl:value-of select="'[]'" />
             </xsl:when>
-            <xsl:when test="//interface[@name=$if]/attribute[@name=$member]">
-            </xsl:when>
-            <xsl:when test="//enum[@name=$if]/const[@name=$member]">
-            </xsl:when>
-            <xsl:when test="//result[@name=$tmp]">
-            </xsl:when>
+            <xsl:when test="key('G_keyInterfacesByName',$if)/attribute[@name=$member]"/>
+            <xsl:when test="key('G_keyEnumsByName',$if)/const[@name=$member]"/>
+            <xsl:when test="count(key('G_keyResultsByName',$tmp)) > 0"/>
             <xsl:otherwise>
               <xsl:message terminate="yes">
