2012-03-08 12 views
1

私はこのようなXMLファイルがある場合:XSLTを使用してXMLに繰り返し要素名を追加しますか?

<properties> 
    <property> 
     <picture1>http://example.com/image1.jpg</picture1> 
     <picture2>http://example.com/image2.jpg</picture2> 
     <picture3>http://example.com/image3.jpg</picture3> 
     <picture4>http://example.com/image4.jpg</picture4> 
     <picture5>http://example.com/image5.jpg</picture5> 
    </property> 
</properties> 

私は仮定に修正アム:私は、各画像のURL要素は、このようなユニークな場所にそれを変換するに行くかどう

<properties> 
    <property> 
     <picture>http://example.com/image1.jpg</picture> 
     <picture>http://example.com/image2.jpg</picture> 
     <picture>http://example.com/image3.jpg</picture> 
     <picture>http://example.com/image4.jpg</picture> 
     <picture>http://example.com/image5.jpg</picture> 
    </property> 
</properties> 

をいくつかの要素に空の値が含まれていても、同じ量の要素が存在する必要があります(画像URLの数はプロパティによって異なります)。

+0

「あなたが____でも同じ量の要素がなければならない...」 – LarsH

答えて

2

この短いと簡単な変換(使用なし軸):

<properties> 
    <property> 
     <picture>http://example.com/image1.jpg</picture> 
     <picture>http://example.com/image2.jpg</picture> 
     <picture>http://example.com/image3.jpg</picture> 
     <picture>http://example.com/image4.jpg</picture> 
     <picture>http://example.com/image5.jpg</picture> 
    </property> 
</properties> 
:提供されるXML文書に適用

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="picture"> 
    <xsl:element name="picture{position()}"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

募集、正しい結果を生成する:

<properties> 
    <property> 
     <picture1>http://example.com/image1.jpg</picture1> 
     <picture2>http://example.com/image2.jpg</picture2> 
     <picture3>http://example.com/image3.jpg</picture3> 
     <picture4>http://example.com/image4.jpg</picture4> 
     <picture5>http://example.com/image5.jpg</picture5> 
    </property> 
</properties> 

説明

  1. picture要素についてidentity ruleをオーバーライド。 AVTxsl:elementname属性内position()機能を使用して

  2. xsl:strip-spaceの使用。

3

count(preceding-sibling::*)+1を使用して、現在の要素のインデックスを取得します。

完全例:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<!-- identity transform --> 
<xsl:template match="node()|@*"> 
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy> 
</xsl:template> 

<!-- override for picture elements to rename element --> 
<xsl:template match="picture"> 
    <xsl:element name="{name()}{count(preceding-sibling::*)+1}"> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

完璧、ありがとう! – Kurt

+0

完璧、ありがとう! – Kurt

+0

@ Kurtでは、 'count(preceding-sibling :: *)+ 1'の代わりに' position() 'を使うこともできます。右フランシス? – LarsH

関連する問題