2011-02-08 22 views
0

我正在使用XSLT转换ivy.xml文件,我基本上想更新特定dependency标记的rev属性。我的问题是与conf属性,我想它保持完全一样,不幸的是>得到转换为>。我常青藤文件看起来像这样:使用XSLT处理属性时未保留字符

<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> 
+2

什么破解XML解析器无法正确读取结果? – 2011-02-08 01:33:47

+0

你得到的结果没有什么不好。 `test->`和`test->`表示完全相同的字符串。 – 2011-02-08 04:19:28

回答

4

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

你不能。由于每W3 XSLT Spec

这是输出转义为用于比在结果树文本节点以外的其他文本节点被禁用的错误。因此,它是禁用输出错误转义一个xsl:或XSL值的:即用于产生注释,处理指令的字符串值或属性节点文本元素“

没有什么问题在含有test-&gt;conf属性。

事实上,无论

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