2014-03-13 61 views
1

我正在使用XSLT來複制文件,我想複製某個節點的所有屬性,但我想用新的屬性替換一些屬性。例如,我可能會這樣:是否有一種簡單的方法來複制元素及其屬性,同時只替換一些屬性?

<Library> 
    <Book author="someone" pub-date="atime" color="black" pages="900"> 
    </Book> 
</Library> 

我怎麼能複製這個,但用新值替換pub-date和color?有沒有類似的東西?

<xsl:template match="/Library/Book"> 
    <xsl:copy> 
     <xsl:attribute name="pub-date">1-1-1976</xsl:attribute> 
     <xsl:attribute name="color">blue</xsl:attribute> 
     <xsl:apply-templates select="*@[not pub-date or color] | node()"/> 
    </xsl:copy> 
</xsl:template> 

但是,這不是有效的,當然...

+0

請不要在你的問題的標題包括「XSLT」。這是標籤系統的用途。謝謝! –

回答

3

另一個方式是依靠這樣一個事實,即如果相同的屬性被寫入兩次,最後一個獲勝。所以:

<xsl:template match="/Library/Book"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:attribute name="pub-date">1-1-1976</xsl:attribute> 
     <xsl:attribute name="color">blue</xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

(你確實要使用模棱兩可的日期格式1976年1月1日?)

+0

好點!但這僅僅是爲了說明問題而設計的一個例子。 – nielsbot

3

我會開始像往常一樣與身份轉換模板

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

然後添加

<xsl:template match="Book/@pub-date"> 
    <xsl:attribute name="pub-date">1-1-1976</xsl:attribute> 
</xsl:template> 

<xsl:template match="Book/@color"> 
    <xsl:attribute name="color">blue</xsl:attribute> 
</xsl:template> 
相關問題