当它们的出现不具体时提取属性

时间:2012-07-13 15:05:44

标签: xslt xslt-1.0

我正在从表格的“td”中提取值背景颜色和宽度属性。

背景颜色和宽度有几种出现方式。 Ť

我有一组有效的元素。

    1.<td style="BACKGROUND-COLOR: yellow; WIDTH: 52%"></td>
    (combination of BACKGROUND-COLOR and Width in one order)
    2.<td style="WIDTH: 52%;BACKGROUND-COLOR: green"></td>
    (combination of BACKGROUND-COLOR and Width in another order)
    3.<td style="WIDTH:52%;BACKGROUND-COLOR:    green"></td>
    (Spaces could vary from ":" and value)
    4.<td style="BACKGROUND-COLOR: gray"></td>
    (only BACKGROUND-COLOR in style)
    5.<td style="BACKGROUND-COLOR: Gray"></td>
    (Value of BACKGROUND-COLOR can be case sensitive)
    6.<td style="BACKGROUND-COLOR: #ffff00"></td>
    (value of BACKGROUND-COLOR can be hexadecimal also)
    7.<td bgcolor="#008000" style="WIDTH: 54%">
    (BACKGROUND-COLOR can occur as bgcolr also(hexadecimal code)
    8.<td bgcolor="yellow">
    (BACKGROUND-COLOR can occur as bgcolr also(string))

有效颜色及其代码列表:(所有值都区分大小写)

Yellow:#ffff00
Gray:#808080
Green:#008000

输出:

1.<bgclr>Yellow</bgclr>
 <colwidth>52</colwidth>

2.<bgclr>Green</bgclr>
  <colwidth>52</colwidth>

3. <bgclr>Green</bgclr>
  <colwidth>52</colwidth>

4.<bgclr>Gray</bgclr>


5.<bgclr>Gray</bgclr>

6.<bgclr>Yellow</bgclr>

7.<bgclr>Green</bgclr>
  <colwidth>54</colwidth>

8.<bgclr>Yellow</bgclr>

我已经尽力解决了这个问题,对我来说这看起来很复杂。

我也提供有效的xml文件。

<tr>
        <td style="BACKGROUND-COLOR: yellow; WIDTH: 52%"></td>

        <td style="WIDTH: 52%;BACKGROUND-COLOR: green"></td>

        <td style="WIDTH:52%;BACKGROUND-COLOR:    green"></td>

        <td style="BACKGROUND-COLOR: gray"></td>

        <td style="BACKGROUND-COLOR: Gray"></td>

        <td style="BACKGROUND-COLOR: #ffff00"></td>

        <td bgcolor="#008000" style="WIDTH: 54%"></td>

        <td bgcolor="yellow"></td>

</tr>

任何人都可以帮忙解决这个问题。 感谢。

1 个答案:

答案 0 :(得分:1)

我们可以利用xsl:apply-templates和谓词的强大功能来避免很多痛苦的xsl:choose语句。模板方法也将为我们提供更加模块化的解决方案。

此XSLT 1.0样式表......

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

<xsl:template match="/">
 <tr>
  <xsl:apply-templates select="*/td"/>
 </tr>
</xsl:template>

<xsl:template match="td">
 <td>
   <xsl:apply-templates
     select="self::*[contains(@style,'BACKGROUND-COLOR:') or @bgcolor]"
     mode="bg-colour"/>
   <xsl:apply-templates
     select="self::*[contains(@style,'WIDTH:')]"
     mode="width"/>
 </td>
</xsl:template>

<xsl:template match="td[@bgcolor]" mode="bg-colour">
 <xsl:call-template name="render-bg-colour">
  <xsl:with-param name="raw-colour" select="@bgcolor" /> 
 </xsl:call-template>  
</xsl:template>

<xsl:template match="td" mode="bg-colour">
 <xsl:call-template name="render-bg-colour">
  <xsl:with-param name="raw-colour" select="
      substring-before( substring-after(concat(@style,';'),'BACKGROUND-COLOR:'), ';')" /> 
 </xsl:call-template>  
</xsl:template>

<xsl:variable name="palette">
 <colours>
   <colour>
      <code>#ffff00</code>
      <name>Yellow</name>
   </colour>
   <colour>
      <code>#808080</code>
      <name>Gray</name>
   </colour>
   <colour>
      <code>#008000</code>
      <name>Green</name>
   </colour>
 </colours>
</xsl:variable>

<xsl:template name="render-bg-colour">
 <xsl:param name="raw-colour" />
  <xsl:variable name="trim-colour" select="normalize-space( $raw-colour)" />
  <xsl:variable name="canon-colour" select="
      document('')//xsl:variable[@name='palette']/colours/colour[
       (translate($trim-colour, $uppercase, $lowercase) = 
        translate(name        , $uppercase, $lowercase)  ) or
    ($raw-colour = code)
    ]/name/text()"/>

 <bgclr>
   <xsl:value-of select="$canon-colour" />
 </bgclr>  
</xsl:template>  

<xsl:template match="td" mode="width">
 <colwidth>
   <xsl:value-of select="
     normalize-space( substring-before( substring-after(@style,'WIDTH:'), '%'))" />
 </colwidth>   
</xsl:template>

</xsl:stylesheet>

...应用于此输入文档时...

<tr>
 <td style="BACKGROUND-COLOR: yellow; WIDTH: 52%"></td>
 <td style="WIDTH: 52%;BACKGROUND-COLOR: green"></td>
 <td style="WIDTH:52%;BACKGROUND-COLOR:    green"></td>
 <td style="BACKGROUND-COLOR: gray"></td>
 <td style="BACKGROUND-COLOR: Gray"></td>
 <td style="BACKGROUND-COLOR: #ffff00"></td>
 <td bgcolor="#008000" style="WIDTH: 54%"></td>
 <td bgcolor="yellow"></td>
</tr>

...将产生此输出文档......

<tr>
  <td>
    <bgclr>Yellow</bgclr>
    <colwidth>52</colwidth>
  </td>
  <td>
    <bgclr>Green</bgclr>
    <colwidth>52</colwidth>
  </td>
  <td>
    <bgclr>Green</bgclr>
    <colwidth>52</colwidth>
  </td>
  <td>
    <bgclr>Gray</bgclr>
  </td>
  <td>
    <bgclr>Gray</bgclr>
  </td>
  <td>
    <bgclr>Yellow</bgclr>
  </td>
  <td>
    <bgclr>Green</bgclr>
    <colwidth>54</colwidth>
  </td>
  <td>
    <bgclr>Yellow</bgclr>
  </td>
</tr>