使用XSLT处理时,保持字符在属性中不转义

时间:2011-02-08 00:42:26

标签: xslt ivy

我正在使用XSLT转换ivy.xml文件,我基本上想要更新特定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"/>

我已尝试在conf属性的显式设置上设置disable-output-escaping="no",但这不起作用

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

1 个答案:

答案 0 :(得分:4)

  

我的问题是conf属性,   我希望它保持完全相同,   不幸的是>被转换为   &gt;

你做不到。根据{{​​3}}

对于用于结果树中除文本节点之外的其他内容的文本节点,禁用输出转义是错误的。因此,禁用xsl的输出转义是错误的: value-of或xsl:text元素,用于生成注释,处理指令或属性节点的字符串值

包含conf的{​​{1}}属性中没有任何问题。

事实上,两者都是

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;完全相同 - 这些字符完全相同,但以不同方式指定。