1

フォームの入力xmlがあります

<content xml:lang="en" xmlns:w="http://www.w.com/sch/W">
 <w:firstRowHeader>true</w:firstRowHeader>
 <w:firstColumnHeader>true</w:firstColumnHeader>
 <w:customTable>
  <w:tableContent>
   <w:row>
    <w:cell>
     <w:spanInfo backgroundColor="Yellow" columnWidth="5" isRowHeader="true"/>
     <text>ghnmghmg</text>
    </w:cell>
    <w:cell>
     <w:spanInfo backgroundColor="Yellow" isRowHeader="false"/>
     <text>ghmhgmgm</text>
    </w:cell>
   </w:row>
   <w:row>
    <w:cell>
     <w:spanInfo backgroundColor="Yellow" columnWidth="5" isRowHeader="false"/>
     <text>vj</text>
    </w:cell>
    <w:cell>
     <w:spanInfo columnWidth="5" isRowHeader="true"/>
     <text>mm</text>
    </w:cell>
   </w:row>
  </w:tableContent>
 </w:customTable>
</content>

これは、次のようなxmlに変換する必要があります。

  1. w:tableContentがtablecontentにマップされ、
  2. 次に、tablecontentタグ「table」の下に「tbody」タグが作成されます
  3. w:行はtrタグにマップされます
  4. w:tdタグにマップされたセル
  5. 条件は次のようなものです
    1. w:rowの最初のw:cell要素のみが属性isRowHeaderを「true」として持つ場合、それぞれの「tr」タグの下にあるすべての「td」要素には「strong」タグが含まれ、2番目のw:cellのisRowHeaderは無視されます。
    2. w:firstRowHeaderが「true」の場合、変換されたテーブルには太字の1行目のテキストが含まれている必要があります。つまり、テーブルの1行目のすべての「td」タグには「strong」タグが含まれている必要があります。
    3. w:firstColumnHeaderが「true」の場合、変換されたテーブルの最初の列のテキストは太字である必要があります。つまり、テーブルのすべてのtrタグの最初の「td」タグには「strong」タグが含まれている必要があります。

変換されたxml:

<content>
 <tablecontent>
  <table cellspacing="1" cellpadding="1" border="1" style="WIDTH: 100%" title="Title"  xmlns="http://www.w3.org/1999/xhtml">
   <tbody>
    <tr>
     <td style="BACKGROUND-COLOR: Yellow; WIDTH: 5%"><strong>ghnmghmg</strong></td>
     <td style="BACKGROUND-COLOR: Yellow"><strong>ghmhgmgm</strong></td>
    </tr>
    <tr>
     <td style="BACKGROUND-COLOR: Yellow; WIDTH: 5%">vj</td>
     <td style="WIDTH: 5%">mm</td>
    </tr>
   </tbody>
  </table>
 </tablecontent>
</content>

これは私が試したxsltテンプレートですが、これらの「強力な」タグを実装する方法を理解できません...

XSLT:

<xsl:template match="w:tableContent">
<xsl:variable name="var3" select="../w:firstRowHeader"/>
<xsl:variable name="var4" select="../w:firstColumnHeader"/>
 <tablecontent>
  <table cellspacing="1" cellpadding="1" border="1" style="WIDTH: 100%" title="Title" xmlns="http://www.w3.org/1999/xhtml" >
   <tbody>
    <xsl:for-each select="child::*">
     <xsl:choose>
      <xsl:when test="name()='w:row'">
       <tr>
       <xsl:for-each select="child::*">
        <xsl:choose>
         <xsl:when test="name()='w:cell'">
          <td>
           <xsl:for-each select="child::*">
            <xsl:choose>
             <xsl:when test="name()='w:spanInfo'">
              <xsl:variable name="var8" select="@backgroundColor" />
              <xsl:variable name="var9" select="@columnWidth" />
              <xsl:variable name="var10" select="@isRowHeader" />
              <xsl:if test="$var8!='' or $var9!=''">
               <xsl:attribute name="style">
                <xsl:if test="$var8!='' and $var9!=''">
                 <xsl:value-of select="concat('BACKGROUND-COLOR: ',$var8,'; WIDTH: ',$var9,'%')" />
                </xsl:if>
                <xsl:if test="$var8!='' and not($var9)">
                 <xsl:value-of select="concat('BACKGROUND-COLOR: ',$var8)" />
                </xsl:if>
                <xsl:if test="not($var8) and $var9!=''">
                 <xsl:value-of select="concat('WIDTH: ',$var9,'%')" />
                </xsl:if>
             </xsl:when>
             <xsl:when test="name()='text'">
              <xsl:if test="../w:spanInfo/@isRowHeader='true'">
               <strong><xsl:value-of select="." /></strong>
              </xsl:if>
              <xsl:if test="../w:spanInfo/@isRowHeader!='true' or not(../w:spanInfo/@isRowHeader) ">
               <xsl:value-of select="." />
              </xsl:if>
             </xsl:when>
            </xsl:choose>
           </xsl:for-each>
          </td> 
         </xsl:when>
        </xsl:choose>
       </xsl:for-each> 
      </tr>
     </xsl:when>
    </xsl:choose>
   </xsl:for-each>
  </tbody>
 </table>
 </tablecontent>
</xsl:template>

ただし、上記のテンプレートは、w:spanInfoの「isRowHeader」属性のみが「true」であるセルに「strong」タグを追加します。ただし、1番目のセルにすでに「isRowHeader」属性が「true」である場合は、w:spanInfoの「isRowHeader」属性の値に関係なく、「strong」タグを2番目のセルのコンテンツに追加する必要があります。

4

1 に答える 1

1

このXSLT1.0スタイルシート..。

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

<xsl:template match="/">
 <content>
   <xsl:apply-templates select="*/*/w:tableContent"/>
 </content>
</xsl:template>

<xsl:template match="w:tableContent">
 <table cellspacing="1" cellpadding="1" border="1" style="WIDTH: 100%" title="Title"  xmlns="http://www.w3.org/1999/xhtml">
  <tbody>
   <xsl:apply-templates select="w:row" /> 
  </tbody>
 </table>  
</xsl:template>

<xsl:template match="w:row">
 <tr>
  <xsl:apply-templates select="w:cell" /> 
 </tr>  
</xsl:template>

<xsl:template match="w:cell">
 <xsl:variable name="style">
  <xsl:if test="w:spanInfo/@backgroundColor">
   <xsl:value-of select="concat('BACKGROUND-COLOR: ',w:spanInfo/@backgroundColor)" /> 
  </xsl:if>
  <xsl:if test="w:spanInfo/@columnWidth">
   <xsl:if test="w:spanInfo/@backgroundColor">
    <xsl:value-of select="'; '" /> 
   </xsl:if>
   <xsl:value-of select="concat('WIDTH: ',w:spanInfo/@columnWidth,'%')" /> 
  </xsl:if>
 </xsl:variable>  
 <td>
  <xsl:if test="$style">
   <xsl:attribute name="style"><xsl:value-of select="$style" /></xsl:attribute> 
  </xsl:if>  
  <xsl:apply-templates select="text" />
 </td>
</xsl:template>

<xsl:template match="w:cell/text[
    not( ../../preceding-sibling::w:row) and (/*/w:firstRowHeader='true')
               or
    not( ../preceding-sibling::w:cell) and (/*/w:firstColumnHeader='true')
               or
    (../preceding-sibling::w:cell[last()]/w:spaninfo/@isRowHeader='true')
    ]">
 <strong><xsl:call-template name="default-rendering-of-text" /></strong>     
</xsl:template>

<xsl:template match="text" name="default-rendering-of-text">
 <xsl:value-of select="." />    
</xsl:template>

</xsl:stylesheet>

...あなたのルールを満たす必要があります。太字/強力なレンダリングに設定した3つの条件は、テキスト要素の一致条件の述語(スタイルシートの終わり近く)によって明確に示されます。不要なxsl:for-eachを回避することで、よりシンプルでモジュール化された、より読みやすいテンプレートベースのソリューションを使用できます。

于 2012-07-10T15:52:21.060 に答える