【问题标题】:How to move out the dynamic result-document into the separate included or imported xsl file如何将动态结果文档移出到单独的包含或导入的 xsl 文件中
【发布时间】:2011-10-31 19:45:29
【问题描述】:

我有一堆 xsl 文件。我想集中控制结果文档的缩进。我现在在每个 xsl 文件中使用下面的代码。我在每个文件中都有一个 xsl:template name="data" 模板,但是这个模板的内容是不同的。是否可以将 xsl:template match="/" 的内容正确移出到单独的 xsl 文件中并将其导入每个 xsl 文件中。我试过但没有效果。有人可以告诉我一个工作代码吗?

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                          xmlns="http://www.w3.org/1999/xhtml">
<xsl:output name="indent" method="html" indent="yes" omit-xml-declaration="yes"/>
<xsl:output name="no_indent" method="html" indent="no" omit-xml-declaration="yes"/>

   <xsl:template match="/">
    <xsl:variable name="indent" select="//page/view-data/html-indent"/>
    <xsl:if test="$indent='yes'">
     <xsl:result-document format="indent" >
       <xsl:call-template name="data"/>
     </xsl:result-document>
    </xsl:if>
    <xsl:if test="$indent='no'">
     <xsl:result-document format="no_indent" >
       <xsl:call-template name="data"/>
     </xsl:result-document>
    </xsl:if>
   </xsl:template>

   <xsl:template name="data">
   <!-- The content is different from file to file -->
   </xsl:template>
</xsl:stylesheet>

【问题讨论】:

  • 您也可以尝试 xsl:include 指令 - 在这种情况下,模板将具有与主文档相同的优先级
  • 没关系,我都试过了:xsl:include 和 xsl:import。没有效果。

标签: xslt doctype xslt-2.0 saxon indentation


【解决方案1】:

您似乎忽略了一个事实,即有一种更简单的方法。

<xsl:param name="indent" select="'no'"/>
<xsl:output method="html"/>

<xsl:template match="/">
  <xsl:result-document indent="{$indent}">
    ....
  </xsl:result-document>
</xsl:template>

然后提供 indent 的值作为样式表参数。事实上,还有一种更简单的方法:您可以使用命令行或 Java API 提供的属性覆盖样式表中给出的序列化属性:在命令行中,只需指定 !indent=yes 或 !indent=no。

【讨论】:

  • 感谢您的帮助迈克尔,它的工作原理!我在 web 应用程序中使用我的自定义 jsp 标签来转换带有 xsl 的 jsp 内的 xml 镜头,以便在转换下使用最新版本的 Saxon。然而,更简单的方法在这里没有用。
【解决方案2】:

是的:

将重复代码移动到新的 .xsl 例如main.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output name="indent" method="html" indent="yes" omit-xml-declaration="yes"/>
<xsl:output name="no_indent" method="html" indent="no" omit-xml-declaration="yes"/>

<xsl:template match="/">
 <xsl:variable name="indent" select="//page/view-data/html-indent"/>
 <xsl:if test="$indent='yes'">
  <xsl:result-document format="indent" >
    <xsl:call-template name="data"/>
  </xsl:result-document>
 </xsl:if>
 <xsl:if test="$indent='no'">
  <xsl:result-document format="no_indent" >
    <xsl:call-template name="data"/>
  </xsl:result-document>
 </xsl:if>
</xsl:template>

<xsl:template name="data"/>

</xsl:stylesheet>

然后在您的其他 .xsl 文件中,只需在文档顶部使用 xsl:import :

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="file:///C:/Users/Stefanos/area51/main.xsl"/>
  <!--Other stuff here-->
  <xsl:template match="extra"/>

</xsl:stylesheet>

并添加更多代码。希望它有所帮助:)

【讨论】:

  • 我的代码中的问题是我使用了 并且我无法将它移动到 main.xsl 文件中。每个文件都使用“数据”模板,但每个文件的内容不同。
  • @user1018219 好吧,如果内容不同并且您希望对其进行不同的处理,那么它应该在单独的文件中。简单的。或者,您可以使用带有条件的单个模板来考虑所有可能的不同内容。
  • 我试图将我不同的“数据”模板“原样”保留在 xsl 文件中(比如说 1.xsl、2.xsl、3.xsl)并从
  • @user1018219 没有实际代码,我和其他人都无能为力。
【解决方案3】:

好的,分离后,这是一个 main.xsl 。我只是在这里简化了变量值。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                          xmlns="http://www.w3.org/1999/xhtml">
<xsl:output name="indent" method="html" indent="yes" omit-xml-declaration="yes"/>
<xsl:output name="no_indent" method="html" indent="no" omit-xml-declaration="yes"/>

<xsl:template match="/">
   <xsl:variable name="indent" select="'yes'"/>
   <xsl:if test="$indent='yes'">
     <xsl:result-document format="indent" >
       <xsl:call-template name="data"/>
     </xsl:result-document>
   </xsl:if>
   <xsl:if test="$indent='no'">
     <xsl:result-document format="no_indent" >
       <xsl:call-template name="data"/>
     </xsl:result-document>
   </xsl:if>
</xsl:template>

</xsl:stylesheet>

下一个文件,比如 1.xsl

  <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
      <xsl:import href="main.xsl"/>

      <xsl:template name="data">
      ...
      </xsl:template>
  </xsl:stylesheet>

这里,我有一个xsl转换错误

【讨论】:

  • 您应该已经编辑了原始答案。无论如何,您的问题到底是什么?
  • 分离后的问题是从main.xsl调用1.xsl中的数据模板
  • 你错了。 1.xsl 将导入 main.xsl 中的任何内容并调用该 .xml 中需要调用的任何模板,然后将调用数据模板。
  • 听起来不错,但我的目标是将 xsl:result-document 应用在 1.xsl 中的“数据”模板上,该模板在分离前的一个文件中。
  • 我不知道你是什么意思。在我的第一个实例中,我可以从 xsl:result-document 调用模板,它在我的应用程序中工作。我只想将带有 xsl:result-document 条件的代码移出到单独的文件中并具有相同的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 2015-10-23
  • 2011-12-17
相关资源
最近更新 更多