我肯定不会在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>
此外,如果只想输出具有font
或size
属性的<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没有用处。