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:row 映射到 tr 标签
  4. w:cell 映射到 td 标签
  5. 和条件就像
    1. 如果 w:row 中只有第一个 w:cell 元素的 isRowHeader 属性为“true”,则其各自 'tr' 标签下的每个 'td' 元素都应包含一个 'strong' 标签并忽略第二个 w:cell 的 isRowHeader
    2. 如果 w:firstRowHeader 为“true”,则转换后的表格应该有第一行粗体文本,即表格第一行中的每个“td”标签都应该包含“强”标签
    3. 如果 w:firstColumnHeader 为“true”,则转换后的表格应该有第一列粗体文本,即每个 tr 标签的第一个“td”标签应该包含“强”标签

转换后的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”属性为“真”的单元格中。但是我需要将“强”标签添加到第二个单元格内容中,而不管它的 w:spanInfo 的“isRowHeader”属性的值如何,前提是如果第一个单元格已经将“isRowHeader”属性设置为“真”。

4

1 回答 1

1

这个 XSLT 1.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 回答