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

How to query an attribute on an existing XSLT-FO output node

我正在尝试从 HTML 创建 PDF。我想将内容放在不包含子 table 的行上。我找到了适当的行,但没有任何反应,所以我记录了如下输出:

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

对于文档中的每一行,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>

这使得带有嵌套 table 的输出变得混乱,但在每个 table 行的日志记录中它仍然说:

keep-together = 

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

您可以 select 输入文档中的节点,而不是结果文档中的节点。如果您将临时结果存储在一个变量中,那么使用 XSLT 2 或 3 您还可以直接 select 变量中的节点,或者使用 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>