如何查询现有XSLT-FO输出节点上的属性

时间:2018-02-08 15:25:24

标签: xml xslt xsl-fo apache-fop

我正在尝试从HTML创建PDF。我想将内容保存在不包含子表的行上。我找到了相应的行,但没有任何反应,所以我按如下方式记录了输出:

  <xsl:template match="tr">
    <fo:table-row">
      <xsl:if test="count(descendant::table) = 0">
          <xsl:attribute name="keep-together">  
            <xsl:value-of select="always"/>  
          </xsl:attribute>
       </xsl:if>
      <xsl:message>
        keep-together = <xsl:value-of select="./@keep-together"/>
      </xsl:message>

对于doc中的每一行,FOP日志记录显示:

keep-together = 

所以,我试过了:

<xsl:template match="tr">
  <fo:table-row keep-together="always">
    <xsl:message>
      keep-together = <xsl:value-of select="./@keep-together"/>
    </xsl:message>

这会使嵌套表的输出乱七八糟,但在每个表行的日志记录中,它仍然说:

keep-together = 

那么,如何在新创建的FO输出节点上获取新创建的属性的值?

1 个答案:

答案 0 :(得分:1)

您可以在输入文档中选择节点,而不是在结果文档中选择节点。如果将临时结果存储在变量中,然后使用XSLT 2或3,您也可以直接选择变量中的节点,或者使用XSLT 1首先需要在变量上使用exsl:node-set之类的扩展函数将其转换为一个节点集,并能够在其上应用XPath。

<xsl:template match="tr">
  <xsl:variable name="row">
        <fo:table-row>
            <xsl:if test="descendant::table">
                <xsl:attribute name="keep-together">always</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/>
        </fo:table-row>
  </xsl:variable>
  <xsl:message select="$row/fo:table-row/@keep-together"/>
  <xsl:copy-of select="$row"/>
</xsl:template>