2

是否可以获得 xslt 进程中包含的所有样式表的列表?

我问是因为整个包含/导入过程是在执行之前完成的,我想知道我是否可以访问这些信息?

4

2 回答 2

2

此样式表 (Main.xslt)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

   <xsl:include href="Sub1.xslt"/>
   <xsl:include href="Sub2.xslt"/>

   <xsl:template match="/">
      <root>
         <xsl:value-of select="document('Main.xslt')/xsl:stylesheet/xsl:include/@href"/>
      </root>
   </xsl:template>
</xsl:stylesheet>

及其包含的样式表 Sub1.xslt 和 Sub2.xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template name="Template1">
      <xsl:text>Template 1</xsl:text>
    </xsl:template>
</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template name="Template2">
      <xsl:text>Template 2</xsl:text>
    </xsl:template>
</xsl:stylesheet>

会产生

<?xml version="1.0" encoding="UTF-8"?>
<root>Sub1.xslt Sub2.xslt</root>

可能有不同的方法;我不知道。此外,我不能 100% 确定调用时如何定义基本 URI document('Main.xslt'),这意味着当您希望文件名相对于 XSLT 文件进行解析时,文件名可以相对于 XML 实例进行解析。在任何情况下,我使用驻留在不同于 Main.xslt 的目录中的 XML 实例运行测试,它仍然有效。

附录:

为了递归地遍历树,您可以执行以下操作(XSLT1):

   <xsl:include href="Sub1.xslt"/>
   <xsl:include href="Sub2.xslt"/>

   <xsl:template match="/">
      <root>
         <xsl:call-template name="WalkIncludes">
            <xsl:with-param name="FileName" select="'Main.xslt'"/>
         </xsl:call-template>
      </root>
   </xsl:template>

   <xsl:template name="WalkIncludes">
      <xsl:param name="FileName"/>

         <xsl:for-each select="document($FileName)/xsl:stylesheet/xsl:include/@href">
            <xsl:value-of select="."/>

            <xsl:call-template name="WalkIncludes">
               <xsl:with-param name="FileName" select="."/>
            </xsl:call-template>
         </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>
于 2012-10-29T17:52:52.960 回答
1

这种简短且完全通用的转换产生了一个分层结果(XML 树),它在任何样式表树中呈现所有导入/包含并避免无限循环。请注意,XSLT(1.0 和 2.0)允许循环导入

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:param name="pUri" select="'test-strSplitWordDel2.xsl'"/>
 <xsl:variable name="vVisited" select="'|'"/>

 <xsl:template match="/">
  <xsl:param name="pUri" select="$pUri"/>
  <xsl:param name="pVisited" select="$vVisited"/>

  <xsl:variable name="vVisited" select="concat($pVisited, $pUri, '|')"/>

  <stylesheet uri="{$pUri}">
   <xsl:if test="not(contains($pVisited, concat('|',$pUri,'|')))">
       <xsl:apply-templates select="*/xsl:import|*/xsl:include">
        <xsl:with-param name="pVisited" select="$vVisited"/>
       </xsl:apply-templates>
   </xsl:if>
  </stylesheet>
 </xsl:template>

 <xsl:template match="xsl:import|xsl:include">
   <xsl:param name="pVisited"/>
     <xsl:element name="{local-name()}">
       <xsl:apply-templates select="document(@href)">
        <xsl:with-param name="pUri" select="string(@href)"/>
        <xsl:with-param name="pVisited" select="$pVisited"/>
       </xsl:apply-templates>
     </xsl:element>
 </xsl:template>
</xsl:stylesheet>

例如,当我们将此转换应用于以下 FXSL 样式表 (func-standardXpathFunctions.xsl) 时:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:xdt="http://www.w3.org/2005/04/xpath-datatypes"
 xmlns:xdtOld="http://www.w3.org/2005/02/xpath-datatypes"
 xmlns:xdtOld2="http://www.w3.org/2004/10/xpath-datatypes"
 xmlns:f="http://fxsl.sf.net/"
 exclude-result-prefixes="xs xdt f"
>
<!--
       This module contains the FXSL versions of the "standard" XPath functions

       These are intended as convenience functions, so that they can be passed
       as parameters to other functions (e.g. to f:zipWith())
       or curried and passed as parameters (e.g. to f:map())
-->

 <xsl:import href="func-curry.xsl"/>
 <xsl:import href="func-compose-flist.xsl"/>

 <xsl:import href="func-standardArithmeticXpathFunctions.xsl"/>
 <xsl:import href="func-standardBooleanXpathFunctions.xsl"/>
 <xsl:import href="func-standardStringXpathFunctions.xsl"/>
 <xsl:import href="func-standardNodesXpathFunctions.xsl"/>
 <xsl:import href="func-standardSequencesXpathFunctions.xsl"/>
 <xsl:import href="func-standardAggregateXpathFunctions.xsl"/>
 <xsl:import href="func-standardDateTimeXpathFunctions.xsl"/>
 <xsl:import href="func-standardXSLTXpathFunctions.xsl"/>
 <xsl:import href="func-standardAxisXpathFunctions.xsl"/>

</xsl:stylesheet>

产生了想要的正确结果

<stylesheet uri="test-strSplitWordDel2.xsl">
   <import>
      <stylesheet uri="func-curry.xsl">
         <import>
            <stylesheet uri="../f/func-type.xsl">
               <import>
                  <stylesheet uri="../f/func-XpathConstructors.xsl">
                     <import>
                        <stylesheet uri="func-compose-flist.xsl">
                           <import>
                              <stylesheet uri="func-apply.xsl"/>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
               <import>
                  <stylesheet uri="../f/func-curry.xsl">
                     <import>
                        <stylesheet uri="../f/func-type.xsl"/>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-compose-flist.xsl">
         <import>
            <stylesheet uri="func-apply.xsl"/>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-standardArithmeticXpathFunctions.xsl">
         <import>
            <stylesheet uri="func-curry.xsl">
               <import>
                  <stylesheet uri="../f/func-type.xsl">
                     <import>
                        <stylesheet uri="../f/func-XpathConstructors.xsl">
                           <import>
                              <stylesheet uri="func-compose-flist.xsl">
                                 <import>
                                    <stylesheet uri="func-apply.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                     <import>
                        <stylesheet uri="../f/func-curry.xsl">
                           <import>
                              <stylesheet uri="../f/func-type.xsl"/>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
         <import>
            <stylesheet uri="func-compose-flist.xsl">
               <import>
                  <stylesheet uri="func-apply.xsl"/>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-standardBooleanXpathFunctions.xsl">
         <import>
            <stylesheet uri="func-curry.xsl">
               <import>
                  <stylesheet uri="../f/func-type.xsl">
                     <import>
                        <stylesheet uri="../f/func-XpathConstructors.xsl">
                           <import>
                              <stylesheet uri="func-compose-flist.xsl">
                                 <import>
                                    <stylesheet uri="func-apply.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                     <import>
                        <stylesheet uri="../f/func-curry.xsl">
                           <import>
                              <stylesheet uri="../f/func-type.xsl"/>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
         <import>
            <stylesheet uri="func-compose-flist.xsl">
               <import>
                  <stylesheet uri="func-apply.xsl"/>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-standardStringXpathFunctions.xsl">
         <import>
            <stylesheet uri="func-curry.xsl">
               <import>
                  <stylesheet uri="../f/func-type.xsl">
                     <import>
                        <stylesheet uri="../f/func-XpathConstructors.xsl">
                           <import>
                              <stylesheet uri="func-compose-flist.xsl">
                                 <import>
                                    <stylesheet uri="func-apply.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                     <import>
                        <stylesheet uri="../f/func-curry.xsl">
                           <import>
                              <stylesheet uri="../f/func-type.xsl"/>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
         <import>
            <stylesheet uri="func-compose-flist.xsl">
               <import>
                  <stylesheet uri="func-apply.xsl"/>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-standardNodesXpathFunctions.xsl">
         <import>
            <stylesheet uri="func-curry.xsl">
               <import>
                  <stylesheet uri="../f/func-type.xsl">
                     <import>
                        <stylesheet uri="../f/func-XpathConstructors.xsl">
                           <import>
                              <stylesheet uri="func-compose-flist.xsl">
                                 <import>
                                    <stylesheet uri="func-apply.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                     <import>
                        <stylesheet uri="../f/func-curry.xsl">
                           <import>
                              <stylesheet uri="../f/func-type.xsl"/>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
         <import>
            <stylesheet uri="func-compose-flist.xsl">
               <import>
                  <stylesheet uri="func-apply.xsl"/>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-standardSequencesXpathFunctions.xsl">
         <import>
            <stylesheet uri="func-curry.xsl">
               <import>
                  <stylesheet uri="../f/func-type.xsl">
                     <import>
                        <stylesheet uri="../f/func-XpathConstructors.xsl">
                           <import>
                              <stylesheet uri="func-compose-flist.xsl">
                                 <import>
                                    <stylesheet uri="func-apply.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                     <import>
                        <stylesheet uri="../f/func-curry.xsl">
                           <import>
                              <stylesheet uri="../f/func-type.xsl"/>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
         <import>
            <stylesheet uri="func-compose-flist.xsl">
               <import>
                  <stylesheet uri="func-apply.xsl"/>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-standardAggregateXpathFunctions.xsl">
         <import>
            <stylesheet uri="func-curry.xsl">
               <import>
                  <stylesheet uri="../f/func-type.xsl">
                     <import>
                        <stylesheet uri="../f/func-XpathConstructors.xsl">
                           <import>
                              <stylesheet uri="func-compose-flist.xsl">
                                 <import>
                                    <stylesheet uri="func-apply.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                     <import>
                        <stylesheet uri="../f/func-curry.xsl">
                           <import>
                              <stylesheet uri="../f/func-type.xsl"/>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
         <import>
            <stylesheet uri="func-compose-flist.xsl">
               <import>
                  <stylesheet uri="func-apply.xsl"/>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-standardDateTimeXpathFunctions.xsl">
         <import>
            <stylesheet uri="func-curry.xsl">
               <import>
                  <stylesheet uri="../f/func-type.xsl">
                     <import>
                        <stylesheet uri="../f/func-XpathConstructors.xsl">
                           <import>
                              <stylesheet uri="func-compose-flist.xsl">
                                 <import>
                                    <stylesheet uri="func-apply.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                     <import>
                        <stylesheet uri="../f/func-curry.xsl">
                           <import>
                              <stylesheet uri="../f/func-type.xsl"/>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-standardXSLTXpathFunctions.xsl">
         <import>
            <stylesheet uri="func-map.xsl">
               <import>
                  <stylesheet uri="func-apply.xsl"/>
               </import>
               <import>
                  <stylesheet uri="func-curry.xsl">
                     <import>
                        <stylesheet uri="../f/func-type.xsl">
                           <import>
                              <stylesheet uri="../f/func-XpathConstructors.xsl">
                                 <import>
                                    <stylesheet uri="func-compose-flist.xsl">
                                       <import>
                                          <stylesheet uri="func-apply.xsl"/>
                                       </import>
                                    </stylesheet>
                                 </import>
                              </stylesheet>
                           </import>
                           <import>
                              <stylesheet uri="../f/func-curry.xsl">
                                 <import>
                                    <stylesheet uri="../f/func-type.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
         <import>
            <stylesheet uri="func-flip.xsl">
               <import>
                  <stylesheet uri="func-apply.xsl"/>
               </import>
               <import>
                  <stylesheet uri="func-curry.xsl">
                     <import>
                        <stylesheet uri="../f/func-type.xsl">
                           <import>
                              <stylesheet uri="../f/func-XpathConstructors.xsl">
                                 <import>
                                    <stylesheet uri="func-compose-flist.xsl">
                                       <import>
                                          <stylesheet uri="func-apply.xsl"/>
                                       </import>
                                    </stylesheet>
                                 </import>
                              </stylesheet>
                           </import>
                           <import>
                              <stylesheet uri="../f/func-curry.xsl">
                                 <import>
                                    <stylesheet uri="../f/func-type.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
   <import>
      <stylesheet uri="func-standardAxisXpathFunctions.xsl">
         <import>
            <stylesheet uri="func-curry.xsl">
               <import>
                  <stylesheet uri="../f/func-type.xsl">
                     <import>
                        <stylesheet uri="../f/func-XpathConstructors.xsl">
                           <import>
                              <stylesheet uri="func-compose-flist.xsl">
                                 <import>
                                    <stylesheet uri="func-apply.xsl"/>
                                 </import>
                              </stylesheet>
                           </import>
                        </stylesheet>
                     </import>
                     <import>
                        <stylesheet uri="../f/func-curry.xsl">
                           <import>
                              <stylesheet uri="../f/func-type.xsl"/>
                           </import>
                        </stylesheet>
                     </import>
                  </stylesheet>
               </import>
            </stylesheet>
         </import>
         <import>
            <stylesheet uri="func-compose-flist.xsl">
               <import>
                  <stylesheet uri="func-apply.xsl"/>
               </import>
            </stylesheet>
         </import>
      </stylesheet>
   </import>
</stylesheet>
于 2012-10-30T00:05:29.103 回答