我绝对不会在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中只有很少的大小和字体。
非常感谢你的帮助,我开始自己想要自己做头发......
答案 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无用。