我正在编写一个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可以实现吗?
答案 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>