2011-07-25 31 views
3

私のような構造を有する私のXMLドキュメント、上のいくつかの本当に単純にXSLTを行うために探しています:シンプルなXSLT属性追加

<XML> 
    <TAG1 attribute1="A"> 
     <IRRELEVANT /> 
     <TAG2 attribute2="B" attribute3="34" /> 
    </TAG1> 
</XML> 

そして、次の処理を行いXSLT作るしようとしています:

  1. コピーすべて
  2. TAG2する@ attribute1の= "A" AND TAG2する@ attribute2の= "B" とNO TAG2する@ attribute4はありませんが、その後、TAG2への@ attribute4を追加し、TAG2する@ attribute3の値になるように、その値を持っている場合

私の試行に失敗しました。私が得ているエラーは、 "xsl:attribute:子要素が要素に既に追加されている場合、要素に属性を追加できません。"

ありがとうございました!

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="newDocumentHeader" /> 

    <!-- copy idiom copying ALL nodes --> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="node() | @*" /> 
     </xsl:copy> 
    </xsl:template> 

    <!-- override for special case --> 
    <xsl:template match="TAG1[@attribute1='A']/TAG2[@attribute2='B'][not(@attribute4)]"> 
     <xsl:attribute name="attribute4"> 
     <xsl:value-of select="@attribute3" /> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

答えて

1

あなたのXSLTコードに欠けている何がマッチした要素の単なるコピーです。しかし、あなたのケース(シンプルなXSLT属性追加)であなたが直接attribute3ノード上書きすることができます:あなたの現在の変換に

<xsl:template match="TAG1[@attribute1='A'] 
     /TAG2[@attribute2='B' and not(@attribute4)] 
      /@attribute3"> 
    <xsl:copy-of select="."/> 
    <xsl:attribute name="attribute4"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
</xsl:template> 

統合し、生産:

<XML> 
    <TAG1 attribute1="A"> 
     <IRRELEVANT></IRRELEVANT> 
     <TAG2 attribute2="B" attribute3="34" attribute4="34"></TAG2> 
    </TAG1> 
</XML> 
+1

おかげで、本当に明らかに! – skelly

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

    <xsl:template match="node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="TAG1[@attribute1 = 'A']/TAG2[@attribute2= 'B' ][not(@attribute4)]"> 
     <xsl:copy> 
      <xsl:attribute name="attribute4"> 
       <xsl:value-of select="@attribute3" /> 
      </xsl:attribute> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 

    </xsl:template> 

</xsl:stylesheet> 

結果:

<XML> 
    <TAG1 attribute1="A"> 
     <IRRELEVANT /> 
     <TAG2 attribute4="34" attribute2="B" attribute3="34" /> 
    </TAG1> 
</XML> 
関連する問題