2013-07-17 53 views
0

嘗試修改我的XML文件時出現以下問題。 我想三個轉變適用於以下輸入:4使用XSLT 1.0重命名並添加新元素

<sheet> 
<row> 
    <column_1>11</column_1> 
    <column_2></column_2> 
    <column_3></column_3> 
</row> 
<row> 
    <column_1></column_1> 
    <column_2></column_2> 
    <column_3></column_3> 
</row> 
<row> 
    <column_1></column_1> 
    <column_2></column_2> 
    <column_3></column_3> 
</row> 
</sheet> 

1)移位/重命名列, 我能做到這一點使用下面的XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output indent="yes"/> 
<xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="row/*"> 
    <xsl:element name="column_{substring(name(),8,string-length(name())-7)+4}"> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:element> 
</xsl:stylesheet> 

接收的輸出:所以下面收到輸出之前已經存在的

<sheet> 
<row> 
    <column_5>11</column_5> 
    <column_6></column_6> 
    <column_7></column_7> 
</row> 
<row> 
    <column_5></column_5> 
    <column_6></column_6> 
    <column_7></column_7> 
</row> 
<row> 
    <column_5></column_5> 
    <column_6></column_6> 
    <column_7></column_7> 
</row> 
</sheet> 

2)添加元素: 我必須說我在這裏丟失如何使其工作並不存在。

<sheet> 
<row> 
    <column_1></column_1> 
    <column_2></column_2> 
    <column_3></column_3> 
    <column_4></column_4> 
    <column_5>11</column_5> 
    <column_6></column_6> 
    <column_7></column_7> 
</row> 
<row> 
    <column_1></column_1> 
    <column_2></column_2> 
    <column_3></column_3> 
    <column_4></column_4> 
    <column_5></column_5> 
    <column_6></column_6> 
    <column_7></column_7> 
</row> 
<row> 
    <column_1></column_1> 
    <column_2></column_2> 
    <column_3></column_3> 
    <column_4></column_4> 
    <column_5></column_5> 
    <column_6></column_6> 
    <column_7></column_7> 
</row> 
</sheet> 

3)包含以下我用傳播數據XSLT,它的工作原理如果應用在自己的,但是當1點合併)我沒有得到的結果只有品脫被應用1

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output indent="yes"/> 
<xsl:template match="node() | @*"> 
<xsl:copy> 
    <xsl:apply-templates select="node() | @*"/> 
</xsl:copy> 
</xsl:template> 
<xsl:template match="column_5"> 
<xsl:copy> 
    <xsl:choose> 
    <xsl:when test=".=''"> 
     <xsl:value-of select="preceding::column_5[. != ''][1]"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:apply-templates select="node() | @*"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

我預期的結果將是:

<sheet> 
<row> 
    <column_1></column_1> 
    <column_2></column_2> 
    <column_3></column_3> 
    <column_4></column_4> 
    <column_5>11</column_5> 
    <column_6></column_6> 
    <column_7></column_7> 
</row> 
<row> 
    <column_1></column_1> 
    <column_2></column_2> 
    <column_3></column_3> 
    <column_4></column_4> 
    <column_5>11</column_5> 
    <column_6></column_6> 
    <column_7></column_7> 
</row> 
<row> 
    <column_1></column_1> 
    <column_2></column_2> 
    <column_3></column_3> 
    <column_4></column_4> 
    <column_5>11</column_5> 
    <column_6></column_6> 
    <column_7></column_7> 
</row> 
</sheet> 

感謝, Lehu

+0

你的XML被慣用地破壞,你*真的*不願意保持這種方式。如果您有任何機會,請嘗試將「」更改爲「」。有沒有可接受的理由,有這樣的編號元素名稱 - 它會繼續給你像這樣的頭痛。 – Tomalak

+0

由不同的系統使用列號,所以需要保持這種方式。 – LeHu

+0

不能是定義爲屬性的列數?我同意@Tomalak你的命名不是很方便。 –

回答

0

這不是很漂亮,但在這裏你走了。

<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="row"> 
    <xsl:copy> 
     <column_1 /> 
     <column_2 /> 
     <column_3 /> 
     <column_4 /> 
     <xsl:apply-templates select="*" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="row/*"> 
    <xsl:element name="column_{substring-after(name(), 'column_') + 4}"> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="column_1[. = '']"> 
    <column_5> 
     <xsl:value-of select="preceding::column_1[. != ''][1]/text()" /> 
    </column_5> 
    </xsl:template> 

</xsl:stylesheet> 
+0

謝謝你對我有用:) – LeHu