根据文档内容选择XSL转换

时间:2016-06-02 23:38:35

标签: xslt

我有大量由不同发布商创建的XHTML文档,由meta标记确定:

<meta name="citation_publisher" content="ACME publisher"/>

或在其他文件中

<meta name="citation_publisher" content="BETA publisher"/>

等。 我写过样式表(每页约1页),例如

acme.xsl
beta.xsl

等。 但是,在我阅读XHTML文件之前,我不知道发布者的名称。

写一个巨大的表单样式表是可能的,但是非常混乱:

<xsl:choose>
  <xsl:when test="$publisher='ACME publisher'">
    <!-- acme.xsl sheet-->
  </xsl:when>
  <xsl:when test="$publisher='BETA publisher'">
    <!-- beta.xsl sheet-->
  </xsl:when>
</xsl:choose>

但至少有100个XSL文件。 在XSL1中,有没有办法根据发布者选择样式表块?将样式表作为单独的文件和<xsl:import>它们而不是只有一个巨大的文件会很好。

更新: 我认为@Dimitre已正确回答了问题(所以我已经接受了)。我怀疑@ MichaelKay实际上更好,但它确实依赖于管理变压器的管道。我将尝试<xsl:include>作为原型,看看它是否有缺点。

2 个答案:

答案 0 :(得分:3)

我不会尝试在单个XSLT样式表中执行此操作。听起来像是XProc的一个很好的候选者,或者类似的管道技术(例如Orbeon)。步骤1,使用XPath对文档进行分类,步骤2,使用根据步骤1的结果选择的样式表对其进行转换。

答案 1 :(得分:1)

  

但至少有100个XSL文件。在XSL1中有什么办法吗?   根据发布者选择样式表块?这将是   很高兴将样式表作为单独的文件和<xsl:import>它们   而不是只有一个巨大的文件。

以下是执行此操作的一种方法(我正在展示仅使用两种内容发布商类型,并且可以根据需要执行此操作):

主要样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:import href="unknown.xsl"/>
 <xsl:import href="acme.xsl"/>
 <xsl:import href="beta.xsl"/>

 </xsl:stylesheet>

acme.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/*[meta[@content='ACME publisher']]">
    <xsl:value-of select="x * y"/>
  </xsl:template>
</xsl:stylesheet>

beta.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/*[meta[@content='BETA publisher']]">
    <xsl:value-of select="x + y"/>
  </xsl:template>
</xsl:stylesheet>

unknown.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/*">
    <xsl:message terminate="yes">Error: Unknown content source</xsl:message>
  </xsl:template>
</xsl:stylesheet>

当主样式表中指定的转换应用于此XML文档时

acme.xml:

<t>
  <meta name="citation_publisher" content="ACME publisher"/>
  <x>6</x>
  <y>4</y>
</t>

想要的,正确的结果x*y已生成

24

对此XML文档应用相同的转换时

beta.xml:

<t>
  <meta name="citation_publisher" content="BETA publisher"/>
  <x>6</x>
  <y>4</y>
</t>

再次生成正确的结果x+y

10

最后,当对此XML文档应用相同的转换时:

other.xml:

<t>
  <meta name="citation_publisher" content="OTHER publisher"/>
  <x>6</x>
  <y>4</y>
</t>

转换的结果是需要终止并显示错误消息

Error: Unknown content source
Processing terminated by xsl:message at line 5