Html 基于上下文更改XSLT中的节点
我有一个XSL文件,我想在两个不同的上下文中包含或使用它。在其中一个上下文中,我想使用'fo:block',但在另一个上下文中,我想使用'div class=“block”'Html 基于上下文更改XSLT中的节点,html,xml,xslt,xslt-1.0,xslt-2.0,Html,Xml,Xslt,Xslt 1.0,Xslt 2.0,我有一个XSL文件,我想在两个不同的上下文中包含或使用它。在其中一个上下文中,我想使用'fo:block',但在另一个上下文中,我想使用'div class=“block”' 是否有某种方法可以根据上下文(可能使用参数)将XSL中的所有“fo:block”更改为“div class=“block””,或将其更改为“div class=“block”?这是一个简单的条件: <xsl:variable name="outputformat" select="'html'"/> <x
是否有某种方法可以根据上下文(可能使用参数)将XSL中的所有“fo:block”更改为“div class=“block””,或将其更改为“div class=“block”?这是一个简单的条件:
<xsl:variable name="outputformat" select="'html'"/>
<xsl:choose>
<xsl:when test="$outputformat = 'html'">
<div class="Block">
<!-- your html code -->
</div>
</xsl:when>
<xsl:otherwise>
<fo:block>
<!-- your normal code -->
</fo:block>
</xsl:otherwise>
</xsl:choose>
或者,您可以创建第二个xsl文档并复制除
<fo:block/>
你应该换成哪个
<div class="block"/>
这看起来像:
<xsl:template match="@*|node()">
<xsl:choose>
<xsl:when test="local-name() = 'block'">
<xsl:element name="div">
<xsl:attribute name="class" select="'Block'"/>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
你能解释一下“上下文”是什么意思吗?输入中是否有可以匹配的节点?我想,如果您想创建fo:block
或div
,它不会到此为止,而是希望输出XSL-fo或HTML。维护两个不同的样式表似乎更容易,或者编写一个样式表,其中一个模式用于XSL-FO输出,另一个模式用于HTML输出。在您编写的第一个示例中,我的“HTML代码”和“普通代码”中的所有代码都相同,因此,如果我这样做,我将不得不有完全相同的代码两次,除了在第一个我将使用div class=block,在第二个我将使用fo:block。这就是我想要避免的。根据上下文,我希望所有内容包装在fo:blocks或div class=“block”中。所以我想基本上是某种智能的搜索和替换方法?在我的xslt中。如果这有意义的话。好吧,如果你想有两个不同的输出,你必须做两次。。。“是否有办法将XSL中的所有'fo:block'更改为div class='block'”下面的示例获取fo输出,将fo:block更改为div,并将其保存到另一个文件中。顺便说一句,这是做这件事的方法。您不必复制代码两次。我假设您正在使用匹配模板,并且没有对所有内容进行硬编码。只需在其中添加“yourcode”注释,而不是“yourcode”。不幸的是,其中一些注释必须是硬编码的,或者实际上大部分注释都是硬编码的。在这种情况下,您仍然可以像其他语言中的函数一样使用并调用它两次。你称之为“有”。