1

テーブルの「td」から値の背景色と幅の属性を抽出することに取り組んでいます。

背景色と幅の発生にはいくつかの方法があります。T

次の有効な要素のセットがあります。

    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>

これについて誰でも助けることができますか?ありがとう。

4

1 に答える 1

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>
于 2012-07-14T16:15:08.830 に答える