2012-07-25 99 views
-1

肯定我將永遠找不到成功的思維在XSLT ...XSLT轉換XML到XHTML

以下是我有:

<par font="Arial" size="24">text 24</par> 
    <par font="Arial" size="12">text 12</par> 
    <par font="Times New Roman" size="12">text times 12</par> 

這裏是我想要的東西:

<font style="font-family:Arial"><font style="font-size:24">text 24</font></font> 
    <font style="font-family:Arial"><font style="font-size:12">text 12</font></font> 
    <font style="font-family:Times New Roman"><font style="font-size:12">text times 12</font></font> 

當然,這樣的事情也不錯,但對我來說這個解決方案似乎更復雜:

<font style="font-family:Arial;font-size:24">text 24</font> 
<font style="font-family:Arial;font-size:12">text 12</font> 
<font style="font-family:Times New Roman;font-size:12">text times 12</font> 

我認爲(但我可能是錯的)我將不得不爲每個大小和每種字體指定一些代碼。這不是問題,因爲我的xml中只有很少的大小和字體可用。您的幫助

很多很多的感謝,我開始失去我的頭髮試圖通過自己做...

+0

你真的想要哪個輸出?多個''(您的第一個輸出示例)或單個''(您的第二個輸出示例)? – 2012-07-25 15:13:53

+0

此外,** par **元素是否總是具有** font **屬性和** size **屬性,或者它有可能缺少其中一個屬性(例如僅與字體,但不是大小)? – 2012-07-25 15:16:23

+0

@DevNull:2nd比較好。 – Sebange 2012-07-25 15:19:02

回答

3

你可以做這樣的事情:

XML輸入(修改爲良好形成)

<doc> 
    <par font="Arial" size="24">text 24</par> 
    <par font="Arial" size="12">text 12</par> 
    <par font="Times New Roman" size="12">text times 12</par> 
</doc> 

XSLT 1.0

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

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

    <xsl:template match="doc"> 
     <html> 
      <xsl:apply-templates/> 
     </html> 
    </xsl:template> 

    <xsl:template match="par"> 
     <font> 
      <xsl:attribute name="style"> 
       <xsl:apply-templates select="@*"/> 
      </xsl:attribute> 
      <xsl:apply-templates select="node()"/> 
     </font> 
    </xsl:template> 

    <xsl:template match="par/@size"> 
     <xsl:value-of select="concat('font-size: ',.,';')"/> 
    </xsl:template> 
    <xsl:template match="par/@font"> 
     <xsl:value-of select="concat('font-family: ',.,';')"/> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<html> 
    <font style="font-family: Arial;font-size: 24;">text 24</font> 
    <font style="font-family: Arial;font-size: 12;">text 12</font> 
    <font style="font-family: Times New Roman;font-size: 12;">text times 12</font> 
</html> 

此外,您還可以將match="par"更改爲match="par[@font or @size]",如果你只想輸出<font>如果它有一個fontsize屬性。

+0

完美的作品! – Sebange 2012-07-25 15:35:00

+0

@DevNull這是一個很好的答案,但它並不完美。您的樣式屬性值中包含多餘的分號。 – 2012-07-25 15:55:06

+0

@ SeanB.Durkin - 尾隨分號不是必需的,但它也不會傷害任何東西。 – 2012-07-25 17:25:00

0

對DevNull的調整。他是第一個正確答案。詹姆斯的答案是錯的。

我只是是非常迂腐這裏,但實際最簡單的解決方案嚴密....是<擊鼓聲/> ....

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

<xsl:template match="/"> 
<xsl:for-each select="*/par"> 
    <font style="{ string-join(
    for $a in (@size|@font) return 
    concat('font-', if ($a except @font) then 'size' else 'family', ':', $a), 
    ';')}"> 
    <xsl:copy-of select="node()"/> 
    </font> 
</xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

上述XSLT 2.0樣式表將改變此輸入。 ..

<doc> 
    <par font="Arial" size="24">text 24</par> 
    <par font="Arial" size="12">text 12</par> 
    <par font="Times New Roman" size="12">text times 12</par> 
    <par font="Courier">No size specified!</par> 
    <par size="16">No font specified!</par> 
</doc> 

...這個...輸出

<font style="font-family:Arial;font-size:24">text 24</font> 
<font style="font-family:Arial;font-size:12">text 12</font> 
<font style="font-family:Times New Roman;font-size:12">text times 12</font> 
<font style="font-family:Courier">No size specified!</font> 
<font style="font-size:16">No font specified!</font> 

一個小模板,style屬性值中沒有多餘的分號!

沒有提及需要什麼XSLT版本。所以如果OP在XSLT 1.0上,那麼這個解決方案可能對OP沒有用。

+0

B轉換是由IE完成的我只是做了一些搜索,它似乎只接受XSLT-1.0。我添加標籤。 – Sebange 2012-07-27 08:55:47