2012-04-20 68 views
4

我有XSLT轉換的基本知識,但一直掙扎如下:XSLT轉換:新增固定文本中現有的節點值

我的XML包含:

<fixednode1>do not transform me</fixednode1> 
<fixednode2>do not transform me also</fixednode2> 
<element1Label>1234</element1Label> 
<element7Label>hello</element7Label> 
<element9Label>bar</element9Label> 

我要改造整個XML使得,除了2個固定節點,每個節點值是由它的節點名稱預先計劃後面跟着冒號和一個空白,這樣的:

<fixednode1>do not transform me</fixednode1> 
<fixednode2>do not transform me also</fixednode2> 
<element1Label>element1Label: 1234</element1Label> 
<element7Label>element7Label: hello</element7Label> 
<element9Label>element9Label: bar</element9Label> 

它應當優選是一個通用轉換 - xml有時會包含樣式表未知的節點名稱。只有2個固定節點保持不變,但不能轉換,只保留在結果中。

我已經與「選擇,當,否則」聲明搏鬥,但我迷失在眼下。任何幫助或建議,將不勝感激。

親切的問候

Scrat

回答

1

這種轉變:

<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="*[not(starts-with(name(), 'fixednode'))]/text()"> 
    <xsl:value-of select="concat(name(..), ': ', .)"/> 
</xsl:template> 
</xsl:stylesheet> 

當在F應用ollowing XML文檔(提供的XML片段,包裝到一個頂部元件成爲一個良好的XML文檔):

<t> 
    <fixednode1>do not transform me</fixednode1> 
    <fixednode2>do not transform me also</fixednode2> 
    <element1Label>1234</element1Label> 
    <element7Label>hello</element7Label> 
    <element9Label>bar</element9Label> 
</t> 

產生想要的,正確的結果:

<t> 
    <fixednode1>do not transform me</fixednode1> 
    <fixednode2>do not transform me also</fixednode2> 
    <element1Label>element1Label: 1234</element1Label> 
    <element7Label>element7Label: hello</element7Label> 
    <element9Label>element9Label: bar</element9Label> 
</t> 
3

只要有一個通用模板和一個專門的一個:

<xsl:template match="*"> 
    <!-- prepend code here --> 
</xsl:template> 

<xsl:template match="fixednode1|fixednode2" priority="10"> 
    <xsl:copy-of select="."/> 
</xsl:template>