XSLT将XML转换为XHTML

时间:2012-07-25 15:06:11

标签: xml xslt xhtml xslt-1.0

我绝对不会在XSLT中找到成功的想法......

这就是我所拥有的:

   <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中只有很少的大小和字体。

非常感谢你的帮助,我开始自己想要自己做头发......

2 个答案:

答案 0 :(得分: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>属性,则可以将font更改为size

答案 1 :(得分:0)

与DevNull的会面。他是第一个正确答案。詹姆斯回答错了。

我在这里只是非常迂腐,但实际上最简单的解决方案是....&lt; drumroll /&gt; ....

<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>

样式属性值中有一个小模板且没有多余的分号!

没有提到需要什么XSLT版本。因此,如果OP在XSLT 1.0上,则此解决方案可能对OP无用。