我一直在解决我遇到的XSL问题。
基本上,我有一个匹配的模板,可以调用另一个XSL文件中的命名模板。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:include href="/_internal/stylesheets/core/common" />
<xsl:template match="system-page">
<div id="main">
<div class="pageHeading">
<h1><system-page-display-name /> </h1>
<xsl:if test="current()/dynamic-metadata[name='Printable']/value='true' or current()/dynamic-metadata[name='Shareable']/value='true'">
<xsl:call-template name="shareAndPrint">
<xsl:with-param name="shareable" select="current()/dynamic-metadata[name='Shareable']/value" />
<xsl:with-param name="printable" select="current()/dynamic-metadata[name='Printable']/value" />
</xsl:call-template>
</xsl:if>
</div>
<xsl:copy-of select="current()//system-data-structure/html/node()"/>
</div>
</xsl:template>
然后,在另一个文件中,这是我调用的模板:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:spring="http://www.springframework.org/tags" version="1.0">
<xsl:template name="shareAndPrint">
<xsl:param name="shareable"/>
<xsl:param name="printable"/>
<div class="shareBar">
<xsl:if test="$printable = 'true'">
<a class="print" href="javascript:window.print();"><spring:message code="print.label" /></a>
</xsl:if>
<xsl:if test="$shareable = 'true'">
<span class="st_sharethis" id="shareThis"></span>
</xsl:if>
</div>
<xsl:if test="$shareable = 'true'">
<script type="text/javascript">$('#shareThis').attr('displayText','ShareThis');</script>
<script src="http://w.sharethis.com/button/buttons.js" type="text/javascript"></script>
</xsl:if>
</xsl:template>
正如您所看到的,我基本上使用XSL生成一个JSP文件,其中包含spring:message标记,用于翻译我们的网站。
我的问题基本上是无论我做什么,XML输出总是最终得到的HTML元素有xmlns:spring =“http://www.springframework.org/tags”。我已经看过很多与此类问题有关的帖子,但似乎没有一个解决方案对我有用。
以下是一些示例输出:
<div id="main">
<div class="pageHeading"><h1>CR-HTML-Static-WRS-en - test </h1>
<div class="shareBar" xmlns:spring="http://www.springframework.org/tags">
<a class="print" href="javascript:window.print();">
<spring:message code="print.label" />
</a>
<span class="st_sharethis" id="shareThis" ></span>
</div>
<script type="text/javascript" xmlns:spring="http://www.springframework.org/tags">$('#shareThis').attr('displayText','ShareThis');</script>
<script src="http://w.sharethis.com/button/buttons.js" type="text/javascript" xmlns:spring="http://www.springframework.org/tags" ></script>
</div>TEST CR</div>
我尝试在xsl:stylesheet标记上添加exclude-result-prefixs,虽然这会从HTML元素中删除xmlns,然后将其添加到spring:message标记中,这在JSP中不起作用被解析(xmlns是spring:message的无效属性)。所以我不确定我做错了什么或者我还能尝试什么。
如果有人对此有任何想法或解决方案,我将不胜感激。对不起,如果我遗漏了任何东西,我会在需要时添加它。
提前致谢。
答案 0 :(得分:2)
您希望结果包含名称空间前缀,而不包含这些前缀的名称空间声明。这对于xslt来说不是可能的,因为这样的xml输出不会正确 - 所以你需要对这些文件进行后处理,如下所示:
sed -i 's# xmlns:spring="[^"]*"##g' output.html
注意:从理论上讲,disable output escaping有一个选项 - 但它太丑了,使得你的xslt很快就无法维护。我不推荐这个。
答案 1 :(得分:2)
只需将exclude-result-prefixes="spring"
添加到xsl:stylesheet元素。
默认情况下,将<div>
等文字结果元素与所有范围内命名空间一起复制到结果文档中。如果命名空间实际上未在元素或属性名称中使用,则exclude-result-prefixes属性会禁止此操作。你仍然会在spring:message元素本身获得名称空间声明,但可能是想要的。