如何根据 xml 值在表(表是动态的)内设置不同的 fo:block(<fo:table-cell> 内)属性(例如:font-weight="bold")

问题描述 投票:0回答:1

下面是我的示例 xml;

<Item>..</Item>
的数量将固定为(4);和
<ItemName>..</ItemName>
内容也将相同;只有
<ItemValue> ..</ItemValue>
,会改变。 以下是示例 xml:

<Header>
  <Item>
    <ItemName><![CDATA[ItemName1]]></ItemName>
    <ItemValue><![CDATA[ItemValue1]]></ItemValue>
  </Item>
  <Item>
   <ItemName><![CDATA[ItemName2]]></ItemName>
   <ItemValue><![ItemValue2]]></ItemValue>
  </Item>
  <Item>
   <ItemName><![CDATA[ItemName3]]></ItemName>
   <ItemValue><![CDATA[ItemValue3]]></ItemValue>
  </Item>
  <Item>
   <ItemName><![CDATA[ItemName4]]></ItemName>
   <ItemValue><![CDATA[ItemValue4]]></ItemValue>
  </Item>
</Header>

现在我想在这里表示 ItemName(s) 和 ItemValue(s),前提是最后两组是 (ItemName3,ItemValue3) 和 (ItemName4,ItemValue4),我想以粗体显示;显然,我们可以通过根据需要设置 fo:block font-weight="bold" 来逐一遍历。 但是在这里我想在循环中使用它; 试过如下示例代码:

<fo:table table-layout="fixed" width="100%">
  <fo:table-column column-width="30mm"/>
  <fo:table-column column-width="35mm"/>
   <fo:table-body>
     <xsl:for-each select="Header/Item">
       <fo:table-row>
         <fo:table-cell>
            <xsl:choose>
              <xsl:when test="ItemName != 'ItemName3' or ItemName != 'ItemName4'">
               <fo:block>
                 <xsl:value-of select="ItemName"/>
               </fo:block>
              </xsl:when>
              <xsl:otherwise>
                <fo:block font-weight="bold">
                  <xsl:value-of select="ItemName"/>
                 </fo:block>    
              </xsl:otherwise>
              </xsl:choose>             
             </fo:table-cell>
             <fo:table-cell>
               <xsl:choose>
                <xsl:when test="ItemName != 'ItemName3' or ItemName != 'ItemName4'">
                 <fo:block>
                  <xsl:value-of select="ItemValue"/>
                 </fo:block>
                </xsl:when>
                <xsl:otherwise>
                  <fo:block font-weight="bold">
                    <xsl:value-of select="ItemValue"/>
                  </fo:block>   
                </xsl:otherwise>    
                 </xsl:choose>
             </fo:table-cell>
           </fo:table-row>
        </xsl:for-each>
    </fo:table-body>

但是 fop 抱怨 fo:table-cell 缺少子元素;那么可能的解决方案是什么?

更新

在上面的代码中添加了 xsl:choose 现在它没有抱怨但也没有得到预期的结果。相反,所有文本仅以正常字体粗细打印。

按照建议也尝试过代码片段(仅发布粗体逻辑)

<xsl:if test="ItemName != 'ItemName3' or ItemName != 'ItemName4'">
  <xsl:attribute name="font-weight" select="'bold'"/>
</xsl:if>

虽然没有错误,但也没有得到任何预期的结果。

xslt-2.0 xsl-fo apache-fop
1个回答
0
投票

试试这个:

<xsl:for-each select="Header/Item">
  <fo:table-row>
    <fo:table-cell>
      <fo:block>
        <xsl:if test="not(ItemName=('ItemName3','ItemName4'))">
          <xsl:attribute name="font-weight" select="'bold'"/>
        </xsl:if>
        <xsl:value-of select="ItemName"/>
      </fo:block>
    </fo:table-cell>
  </fo:table-row>
</xsl:for-each>
© www.soinside.com 2019 - 2024. All rights reserved.