2011-02-08 10 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> 

と私の出力は次のようになります。私は、明示的にdisable-output-escaping="no"を設定しようとしました

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

conf属性のセットが動作しませんでした。

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

どのような壊れたXMLパーサーが結果を正しく読み取れないのですか? –

+0

結果が悪いことは何もありません。 'test- >'と 'test->'はどちらもまったく同じ文字列を表します。 –

+0

あなたが心配する必要がない理由について私の答えを見てください。また、「間違った」属性値が実際には「良い」属性とまったく同じであるという簡単な証拠です。 :) –

答えて

4

私の問題は が、残念ながら>&gt;に変換されます、私はそれがまったく同じに滞在したいのconf属性、 です。

できません。 W3 XSLT Specあたりのとおり:

これは、出力が結果ツリーにテキストノード以外の何かのために使用されているテキストノードのために無効にするに逃げるためのエラーでこのように、出力を無効にするとエラーになります。 XSLのためのエスケープ:価値のかのxsl:コメントの文字列値を生成するために使用されるテキスト要素、処理命令または属性ノード

は、問題は何もtest-&gt;を含むconf属性ではありません。実際に

、両方

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

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

はまったく同じ文字列値を持っています。

<dependency org="easymock" 
      name="easymock" 
      rev="2.5.2" 
      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> 

:ちょうど、次の単純な変換を適用し、これを確認するには

"test->default,class-extension" 

&nbsp;の代わりに&#160;というコードとまったく同じです。これらは全く同じ文字ですが、異なる方法で指定します。

+0

+1。網羅的。 – Flack

+0

+1とても良い答えです。 –

+0

Dimitreありがとう、私はこれを行うには、私は仕様を壊さなければならないと思います。 – BigBen

関連する問題