Xslt 从随机HTML元素中删除xmlns属性

Xslt 从随机HTML元素中删除xmlns属性,xslt,xml-namespaces,Xslt,Xml Namespaces,我花了很长时间才解决了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问题

基本上,我有一个匹配的模板,它调用另一个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 />&#160;</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>

$('#shareThis').attr('displayText','shareThis');
如您所见,我基本上使用XSL生成一个JSP文件,其中包含spring:message标记,用于翻译我们的站点

我的问题基本上是,无论我做什么,XML输出总是有包含xmlns:spring=”的HTML元素http://www.springframework.org/tags“在他们身上。我看过很多其他与这类问题相关的帖子,但似乎没有一个解决方案适合我

以下是一些示例输出:

<div id="main">
    <div class="pageHeading"><h1>CR-HTML-Static-WRS-en  - test&#160;</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>

CR HTML静态WRS en-测试和#160;
$('#shareThis').attr('displayText','shareThis');
测试铬
我尝试在xsl:stylesheet标记上添加exclude-result前缀,虽然这会从HTML元素中删除xmlns,但它会被添加到spring:message标记中,这在解析JSP时不起作用(xmlns是spring:message的无效属性)。所以我不确定我做错了什么,或者我还能尝试什么

如果有人对此有任何想法或解决方案,我将不胜感激。对不起,如果我遗漏了什么,我会在需要时添加它


提前感谢。

您希望结果包含名称空间前缀,而不包含这些前缀的名称空间声明。这在xslt中是不可能的,因为这样的xml输出格式不好,所以您需要对这些文件进行后处理,如下所示:

sed -i 's# xmlns:spring="[^"]*"##g' output.html

注意:理论上有一个选项-但是它太难看了,并且很快使您的xslt无法维护。我不建议这样做。

只需在xsl:stylesheet元素中添加
exclude result prefixes=“spring”


默认情况下,文本结果元素(如
)与所有范围内名称空间一起复制到结果文档中。“排除结果前缀”属性禁止此操作,前提是名称空间未实际用于元素或属性名称中。您仍然可以在spring:message元素本身上获得名称空间声明,但这可能是需要的。

是的,我已经尝试使用排除结果前缀,但问题是spring:message标记不能包含xmlns属性,或者我的JSP无法工作。当然,除非我也使用Petr Kozelka的解决方案,然后手动从spring:message标签中删除XMLN。嗯,谢谢你的回复。我开始怀疑这是否可能。看来我什么都试过了。我可以按照您的建议手动删除这些属性,我已经有了一项工作,可以在生成的JSP实际用于web应用程序之前对其进行操作。