【问题标题】:XSLT to transform XML to XHTMLXSLT 将 XML 转换为 XHTML
【发布时间】:2012-07-25 15:06:11
【问题描述】:

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

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

【问题讨论】:

  • 您真正想要哪种输出?多个&lt;font&gt;(您的第一个输出示例)或单个&lt;font&gt;(您的第二个输出示例)?
  • 另外,par 元素是否总是同时具有 font 属性和 size 属性,或者是否有可能是否缺少其中一个属性(例如,只有字体但没有大小的 par)?
  • @Tim C : PAR 元素可能没有字体、大小或任何属性

标签: xml xslt xhtml xslt-1.0


【解决方案1】:

你可以这样做:

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 属性的&lt;font&gt;,则可以将match="par" 更改为match="par[@font or @size]"

【讨论】:

  • @DevNull 这是一个很好的答案,但它并不完美。您的样式属性值上出现了一个无关的分号。
  • @SeanB.Durkin - 不需要尾随分号,但它也不会造成任何伤害。
【解决方案2】:

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

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

【讨论】:

  • B 转换由 IE 完成,我只是做了一些搜索,它似乎只接受 XSLT-1.0。我添加标签。
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2013-11-09
相关资源
最近更新 更多