XSLT将XML转换为XHTML



我肯定不会在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中只有很少的大小和字体可用。

非常感谢你的帮助,我开始试着自己放松头发。。。

您可以这样做:

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>

此外,如果只想输出具有fontsize属性的<font>,则可以将match="par"更改为match="par[@font or @size]"

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

上面的XSLT2.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在XSLT1.0上,那么这个解决方案可能对OP没有用处。

相关内容

  • 没有找到相关文章

最新更新