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

Xml 如何查询现有XSLT-FO输出节点上的属性,xml,xslt,xsl-fo,apache-fop,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">

我正在尝试从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>
所以,我试着:

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

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

您可以在输入文档中选择节点,而不是在结果文档中选择节点。如果将临时结果存储在变量中,那么使用XSLT 2或XSLT 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>

我以前从未使用过XSLT。从我开始工作的最后一周,我一直生活在doc网站和stackoverflow上。你能发布一些更具体的东西吗,比如一些我可以用于跳转启动的代码?我不想听起来很愚蠢,但你如何知道你是在使用XSLT 2还是3,以及Apache FOP是否支持它们?你可以使用它来输出你使用的XSLT处理器支持的版本。在Java世界中,Oracle JRE附带了Xalan Java 2的某些版本,它是XSLT 1处理器,但您可以很容易地切换到Saxon 9,在Sourceforge和Maven上的HE版本中作为开源版本提供,后者是版本9.7或更低版本的XSLT 2处理器,版本9.8的XSLT 3处理器。我添加了一个应该使用XSLT 2或3处理器在变量中创建fo:table行,然后使用xsl:message输出其keep-together属性。您是否只关心输出中的内容?只要看看FO文档,凯文,这是个好主意,来自其他场馆,我想了很多次。我正在使用ApacheFop将HTML转换为PDF。这个过程是直接的。我想我可以运行它两次以获得样式化的XML或FO,但FOP似乎无法创建任何中间输出表单。你有什么建议吗?
keep-together = 
<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>