сохранение символов без экранирования в атрибутах при обработке с помощью XSLT - PullRequest
0 голосов
/ 08 февраля 2011

Я преобразую файл ivy.xml с помощью XSLT, я хочу обновить атрибут rev определенного тега dependency. Моя проблема с атрибутом conf, я хочу, чтобы он остался таким же, к сожалению, > преобразуется в >. Мой файл плюща выглядит так:

<ivy-module version="1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
    <info organisation="foo" module="libfoo" revision="1.0.1"/>
    <configurations>

    </configurations>
    <publications>
        <artifact name="libfoo" type="jar" conf="default" />
    </publications>
    <dependencies>
        <dependency org="easymock" name="easymock" rev="2.5.2" conf="test->default,class-extension"/>
    </dependencies>
</ivy-module>

мой XSL выглядит так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output />
    <xsl:param name="dependency.rev" />
    <xsl:param name="dependency.org" />
    <xsl:param name="dependency.name" />

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="dependency">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
            <xsl:choose>
                <xsl:when test="@name=$dependency.name">
                    <xsl:attribute name="rev">
                        <xsl:value-of select="$dependency.rev" />
                    </xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

и мой вывод выглядит так:

<dependency org="easymock" name="easymock" rev="2.5.2" conf="test-&gt;default,class-extension"/>

Я пытался установить disable-output-escaping="no" для явного набора атрибута conf, но это не сработало

<xsl:attribute name="conf">
    <xsl:value-of select="@conf" disable-output-escaping="yes" />
</xsl:attribute>

1 Ответ

4 голосов
/ 08 февраля 2011

Моя проблема с атрибутом conf, я хочу, чтобы он остался таким же, к сожалению, > преобразуется в &gt;.

Вы не можете,В соответствии со спецификацией W3 XSLT :

" Ошибка выхода из режима отключена для текстового узла, который используется для чего-то отличного от текстового узлав дереве результатов. Таким образом, ошибка отключает экранирование выходных данных для элемента xsl: value-of или xsl: text, который используется для генерации строкового значения комментария, инструкции обработки или узла атрибута"

Нет ничего проблемного в атрибуте conf, содержащем test-&gt;.

На самом деле, оба

conf="test->default,class-extension"

и

conf="test-&gt;default,class-extension"

имеют точно такое же строковое значение.

Чтобы убедиться в этом, просто примените следующее простое преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
  "<xsl:value-of select="@conf"/>"
 </xsl:template>
</xsl:stylesheet>

к "плохой результат :

<dependency org="easymock"
            name="easymock"
            rev="2.5.2"
            conf="test-&gt;default,class-extension"
/>

и вы получите :

  "test->default,class-extension"

Это точно так же, как кодирование &#160; вместо &nbsp; - это абсолютно одинаковые символы, но они указываются по-разному.

...