1

我目前正在编写一个 XSLT 文档来将 javadoc XML 输出(不可修改)转换为重组文本。我遇到的问题之一是 javadoc 将具有具有类似结构的 XML

<node1>
   <node2>
       <code/>
   </node2>

   <node3>
      <![CDATA[DataType]]>
   </node3>
</node1>

<node1>
   <node3>
      <![CDATA[s need special formatting, but breaks in restructured text]]>
   </node3>
</node1>

这会产生 ASCII 输出(node2/codeinside of的存在node1表示它应该用 `` 包围)

``DataType``s need special formatting, but break in restructured text

在重组文本中,结尾的 `` 后面不能跟字母数字,否则无法正确呈现,所以我需要能够查看下一个匹配的节点//node1/node3是否不是第一个字符,而不是之前的输出作为字母数字,如果是这样,它会像这样划界

``DataType``\s need special formatting, but breaks in restructured text

但如果是标点符号,以下是可以的

``DataType``. need special formatting, but breaks in restructured text

这对 XSLT2.0 可行吗?

4

1 回答 1

3

做“向后看”可能比向前看更容易,例如

<xsl:template match="node1/node3" priority="1">
  <xsl:value-of select="." />
</xsl:template>

<xsl:template match="node1[node2/code]/node3" priority="2">
  <xsl:text>``</xsl:text>
  <xsl:next-match />
  <xsl:text>``</xsl:text>
</xsl:template>

<!-- special template for the block immediately following a node2/code block -->
<xsl:template match="node1[preceding-sibling::node1[1]/node2/code]/node3" priority="3">
  <xsl:if test="matches(., '^[A-Za-z0-9]')">\</xsl:if>
  <xsl:next-match />
</xsl:template>

您甚至可以将 合并if到匹配表达式中

<xsl:template match="node1[preceding-sibling::node1[1]/node2/code]
                     /node3[matches(., '^[A-Za-z0-9]')]" priority="3">
  <xsl:text>\</xsl:text>
  <xsl:next-match />
</xsl:template>
于 2013-02-08T14:33:15.750 回答