当前位置: 首页 > 知识库问答 >
问题:

如何在xslt中设计一个基于某些条件添加强标记的模板

辛承志
2023-03-14

我已经输入了表单的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”标记,并忽略第二个w:cell的isRowHeader
    2. 如果w:firstRowHeader为“true”,则转换后的表格应具有粗体的第一行文本,即表格第一行中的每个“td”标记应包含“strong”标记
    3. 如果w:firstColumnHeader为“true”,则转换后的表应具有粗体的第1列文本,即表的每个tr标记的第一个“td”标记应包含“strong”标记
    <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模板,但我不知道如何在其中实现这些“强”标记。。。

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

    但是上面的模板将“strong”标记添加到只有w:spanInfo的“isRowHeader”属性为“true”的单元格中。但我需要将“strong”标记添加到第二个单元格内容,而不考虑其w:spanInfo的“isRowHeader”属性的值,前提是第一个单元格已经将“isRowHeader”属性设置为“true”。

共有1个答案

公孙嘉禧
2023-03-14

此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,我们可以使用更简单、更模块化和更可读的基于模板的解决方案。

 类似资料:
  • 我试图通过选择符合以下条件的歌曲节点来转换上述XML: 状态='已发布' 如果匹配Data/Record/@Id的 /AUTH/AUTHOR_ID的AUTH/HIDE值为true,则不显示ART/TYPE(在这种情况下,Id=1826155) 所需的XML输出应包括Type、所有作者和标题。第二个歌曲类型在此示例中隐藏(因为HIDE=true对于主要作者): 我开始尝试每种方法,但发现我无法显示与

  • 我有一个XML,我必须循环测试结果和组件。当组件的类型与特定名称匹配时,我必须对该组件应用不同的模板。我为每种组件类型创建了一个XSL-to,具有不同的模板,例如:NORMALTEXTBOX。但是这些模板并没有被应用到组件块中。。。谁能帮我一下吗? XML XSL

  • 本文向大家介绍如何基于R中的某些列查找唯一行?,包括了如何基于R中的某些列查找唯一行?的使用技巧和注意事项,需要的朋友参考一下 特别是当实验条件相同时,我们希望某些列的某些行值相同,这在设计实验以检查变量的固定效果时也有意做到。如果要确定唯一行,则可以通过使用R中的唯一函数来完成。 示例 请看以下数据帧- 让我们看另一个例子-

  • 了解如何使用 Dreamweaver 模板设计“固定的”页面布局;然后基于模板创建文档,创建的文档会继承模板的页面布局。 模板是一种特殊类型的文档,用于设计“固定的”页面布局;然后您便可以基于模板创建文档,创建的文档会继承模板的页面布局。设计模板时,可以指定在基于模板的文档中哪些内容是用户“可编辑的”。使用模板,模板创作者控制哪些页面元素可以由模板用户(如作家、图形艺术家或其他 Web 开发人员)

  • 我有三种型号 发票 演播室 R_studio_pay 关系如下 工作室有很多发票 工作室有一个R_studio_pay 我需要发票- 我试着使用whereHas studio- 但无法在何处应用条件。

  • 问题内容: 假设我有以下代码: 该语句在计算中是否有效(我认为不是)?如果没有,如何在TensorFlow计算图中添加一条语句? 问题答案: 您是正确的,该语句在这里不起作用,因为该条件是在图构造时评估的,而大概您希望该条件取决于运行时馈入占位符的值。(实际上,它将始终采用第一个分支,因为`condition 0Tensor`,这在Python中是“真实的”。) 为了支持条件控制流,TensorF