查看满足XPATH的下一个节点来定义行为

时间:2013-02-08 14:21:10

标签: xml xslt xpath xslt-2.0 restructuredtext

我正在编写一个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/code内存在node1表示它应该被``包围

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

在重构文本中,结束``后面不能跟一个字母数字或者它不能正确呈现,所以我需要能够看到下一个节点是否匹配{{1}而不是前一个输出。没有它的第一个字符作为字母数字,如果是,它就像这样划分它

//node1/node3

但如果是标点符号,则以下情况很好

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

XSLT2.0可以实现吗?

1 个答案:

答案 0 :(得分: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>