Удаление атрибута xmlns из случайных элементов HTML

У меня было чертовски много времени, чтобы избавиться от проблемы с 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>

Как видите, я в основном использую 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&#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>

Я попытался добавить префиксы exclude-result-prefixs в теги xsl:stylesheet, и хотя это удаляет xmlns из элементов HTML, вместо этого он добавляется в тег spring:message, который не будет работать при анализе JSP ( xmlns является недопустимым атрибутом spring:message). Поэтому я не уверен, что я делаю неправильно или что еще я могу попробовать.

Пожалуйста, если у кого-то есть какие-либо идеи или решения для этого, я был бы очень признателен. Извините, если что-то упустил, при необходимости добавлю.

Заранее спасибо.


person JFranks    schedule 06.11.2012    source источник


Ответы (2)


Вы хотите, чтобы результат содержал префиксы пространств имен без объявлений пространств имен для этих префиксов. Это невозможно при использовании xslt, потому что такой вывод xml не будет корректным, поэтому вам нужно будет выполнить постобработку этих файлов, например:

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

Примечание: теоретически существует возможность отключить экранирование вывода, но это слишком уродливо и очень быстро делает ваш xslt непригодным для сопровождения. Я не рекомендую это.

person Petr Kozelka    schedule 06.11.2012
comment
Хм, спасибо за ответ. Я уже начал сомневаться, возможно это или нет. Вроде все перепробовал. Я мог бы вручную удалить эти атрибуты, как вы предложили, у меня уже есть задание, которое манипулирует полученными JSP до того, как они будут фактически использоваться в веб-приложении. - person JFranks; 07.11.2012

Просто добавьте exclude-result-prefixes="spring" к элементу xsl:stylesheet.

По умолчанию литеральные элементы результата, такие как <div>, копируются в результирующий документ вместе со всеми пространствами имен в области действия. Атрибут exclude-result-prefixes подавляет это при условии, что пространство имен фактически не используется в имени элемента или атрибута. Вы по-прежнему получите объявление пространства имен в самом элементе spring:message, но предположительно это необходимо.

person Michael Kay    schedule 06.11.2012
comment
Да, я уже пытался использовать префиксы exclude-result, но дело в том, что теги spring:message не могут содержать атрибут xmlns, иначе мой JSP не будет работать. Если, конечно, я не использую решение от Петра Козелки и потом вручную не удаляю xmlns из тегов spring:message. - person JFranks; 07.11.2012