我有大量由不同发布商创建的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>
作为原型,看看它是否有缺点。
答案 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