如何将xslt转换调用为xsl样式表

时间:2010-05-15 14:38:47

标签: xslt

我编写了一个xslt来读取一些xml文件名并对它们进行一些操作 我用一个for-each来逐个工作。我在参数$ path中有每个路径。

但是现在我想输出将外部样式表应用于这些文件的结果。我会写类似

的东西
<div> <something like xsl-transform($extern-xslt,$path)> </div>

在主html输出中包含转换的结果树。 有可能吗?

3 个答案:

答案 0 :(得分:2)

您可以使用xsl:import将外部样式表导入主样式表,然后只需将模板应用于该外部XML文件,您可以使用document函数加载该文件。

<div><xsl:apply-templates select="document($path)"/></div>

如果外部样式表中的模板会与主样式表中的模板发生冲突,则可以为它们使用不同的mode

答案 1 :(得分:1)

您可以使用document() XPath函数加载外部XML文件。这将返回一个节点集,可以使用<xml:apply-templates>调用进行解析。包含外部样式表可以使用<xsl:include>标记来完成。

<xsl:include href="$external"/>
<xsl:apply-templates select="document($path)"/>

另见the documentation for document()

答案 2 :(得分:0)

  

我写了一个读取的xslt   一些xml文件名并做了一些   对他们的操作。我使用for-each   一个接一个地工作。我各有一个   参数$ path中的路径。

     

但现在我想输出   申请外部的结果   样式表到那些文件

解决方案由这些成分组成

  1. 使用标准XSLT document()函数加载和访问外部XML文档。

  2. 使用<xsl:import>指令导入外部样式表。

  3. 外部样式表中的模板必须位于特殊mode中,而不是主样式表使用。

  4. 在需要“外部转换”结果的位置,发出<xsl:apply-templates>选择外部文档的必要节点(通常是根节点/或顶部元素/*)。 <xsl:apply-templates>上指定的模式应与外部样式表中使用的模式相同。

  5. 这是一个简单的小例子(没有导入外部样式表,样式表中嵌入了“外部文档”,并且没有使用模式):

    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:my="my:my"
    >
    <!--  <xsl:import href="myExternal.xsl"/> -->
        <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
        <my:div>
          <h2>Weather</h2>
          <p >It will be raining today</p>
        </my:div>
    
     <xsl:template match="node()|@*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
     </xsl:template>
    
     <xsl:template match="insertContents">
       <xsl:apply-templates select="document('')/*/my:div/*"/>
     </xsl:template>
    </xsl:stylesheet>
    

    对此XML文档应用此转换时

    <html>
      <h1>Today's News </h1>
      <insertContents/>
    </html>
    

    产生了所需的结果

    <html>
    
       <h1>Today's News </h1>
    
       <h2 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:my="my:my">Weather</h2>
       <p xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:my="my:my">It will be raining today</p>
    
    </html>
    

    注意以上无关的命名空间仅仅是由于此示例的简化 - 如果外部XML文档位于其自己的文件中,则不会生成它们。