2011-08-15 71 views
3

要啓動:XSL來檢索其他屬性值和值追加到一個屬性

<test style="font:2px;color:#FFFFFF" bgcolor="#CCCCCC" TOPMARGIN="5">style</test> 

使用XSLT/XPATH,我從我的文檔

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

複製一切結束了,但我不知道如何使用XSLT/XPATH獲得此結果:

<test style="background-color:#CCCCCC; margin-top:1;font:2px;color:#FFFFFF">style</test> 

我認爲我在XPATH失敗。這是我在剛剛取回的bgcolor嘗試:

<xsl:template match="@bgColor"> 
<xsl:attribute name="style"> 
    <xsl:text>background-color:</xsl:text> 
    <xsl:value-of select="."/> 
    <xsl:text>;</xsl:text> 
    <xsl:value-of select="../@style"/> 
</xsl:attribute> 
</xsl:template> 

當風格BGCOLOR後放置在原始文檔中不幸的是,即使這打破。如何將這些棄用的屬性值附加到一個內聯樣式屬性中?

+0

好問題,+1。使用XSLT的一個非常好的功能 - 屬性值模板(AVT),查看我的答案,獲得完整,簡短且容易的解決方案。 –

回答

1

這種轉變

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

<xsl:template match="/*"> 
    <test style="{@style};background-color:{@bgcolor};margin-top:{@TOPMARGIN}"> 
    <xsl:value-of select="."/> 
    </test> 
</xsl:template> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<test style="font:2px;color:#FFFFFF" 
     bgcolor="#CCCCCC" TOPMARGIN="5">style</test> 

產生想要的,正確的結果

<test style="font:2px;color:#FFFFFF;background-color:#CCCCCC;margin-top:5">style</test> 

說明:使用AVT

+0

在此解決方案中,封裝整個文檔,並在文檔中顯示文檔中每個節點的文本值。 – asunrey

+0

但是,它確實適用於問題中所述的單個測試實例。 – asunrey

+0

假設我想將它應用於每個元素,而不僅僅是「測試」? – asunrey

0

可能不是最好的方式,但它的工作原理:

<xsl:template match="test"> 
    <xsl:element name="{name()}"> 
     <xsl:apply-templates select="@*[name() != 'bgcolor']"/> 
    </xsl:element> 
</xsl:template>  

<xsl:template match="@*"> 
    <xsl:copy/> 
</xsl:template> 

<xsl:template match="@style"> 
    <xsl:attribute name="style"> 
     <xsl:value-of select="."/> 
     <xsl:text>;background-color:</xsl:text> 
     <xsl:value-of select="../@bgcolor"/> 
    </xsl:attribute> 
</xsl:template>