2017-11-03 19 views
0

で既存の属性を尊重属性!の変換のXML要素は、私は、次のXMLを持っているXSLT

これまでのところ、私はこのXSLTを作成しました:

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

    <xsl:template match="cars"> 
    <cars> 
     <xsl:apply-templates/> 
    </cars> 
    </xsl:template> 

    <xsl:template match="car"> 
    <car> 
     <xsl:for-each select="*"> 
     <xsl:attribute name="{name()}"> 
      <xsl:value-of select="text()"/> 
     </xsl:attribute> 
     </xsl:for-each> 
    </car> 
    </xsl:template> 

</xsl:stylesheet> 

これは、その結果:

<cars> 
    <car brand="Volkswagen" make="Golf" wheels="4" extras=""/> 
</cars> 

問題:車上

  • 属性 "フィルタ" がなくなっています。
  • ノード "extras"の属性はなくなりましたが、ノード "car"内にある必要があります。
  • "extras"という属性は必要ありません。

期待される結果:最初の問題については

<cars filter="yes"> 
    <car brand="Volkswagen" make="Golf" wheels="4" hifi="yes" ac="no"/> 
</cars> 

答えて

1

filter属性がないだろうと、あなたはcars

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
のために特定のテンプレートの代わりに、アイデンティティーテンプレートを使用することによってこの問題を解決することができます

extraが属性として表示されている場合、selectステートメントでは、テキストの要素を選択することができます

<xsl:for-each select="*[normalize-space()]"> 

最後に、属性がextrasの場合は、for-eachを追加してこれらを取得します。

<xsl:for-each select="*/@*"> 
    <xsl:attribute name="{name()}"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
    </xsl:for-each> 

実際に

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

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

    <xsl:template match="car"> 
    <car> 
     <xsl:for-each select="*[normalize-space()]"> 
     <xsl:attribute name="{name()}"> 
      <xsl:value-of select="text()"/> 
     </xsl:attribute> 
     </xsl:for-each> 
     <xsl:for-each select="*/@*"> 
     <xsl:attribute name="{name()}"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
     </xsl:for-each> 
    </car> 
    </xsl:template> 
</xsl:stylesheet> 

このXSLTを試してみて、2つのxsl:for-each文は、これがcarの二つの異なる子要素を持っていないと仮定し、ここで

<xsl:template match="car"> 
<car> 
    <xsl:for-each select="*[normalize-space()]|*/@*"> 
    <xsl:attribute name="{name()}"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
    </xsl:for-each> 
</car> 
</xsl:template> 

注意を組み合わせることができます同じ属性名。

関連する問題