-1

绝对不会在 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 中只有很少的尺寸和字体可用。

非常感谢您的帮助,我开始失去头发试图自己做......

4

2 回答 2

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>

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

于 2012-07-25T15:22:02.047 回答
0

恭喜 DevNull。他是第一个正确答案。詹姆斯的回答是错误的。

我只是在这里非常迂腐,但实际上最简单最严格的解决方案是.... <drumroll/> ....

<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 没有用。

于 2012-07-25T16:34:54.933 回答