xml - 查看满足XPATH的下一个节点以定义行为

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


在重组文本中,结尾的``不能跟字母数字或它不能正确呈现,因此除了前一个输出,我还需要查看匹配//node1/node3的下一个节点是否没有它是字母数字的第一个字符,如果这样做,它将像这样

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


但如果是标点符号,则可以使用以下命令

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


XSLT2.0有可能吗?

最佳答案

做一个“向后看”可能比尝试向前看更容易。

<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合并到match表达式中

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

关于xml - 查看满足XPATH的下一个节点以定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14774601/

相关文章:

jquery - 从 jQuery 元素数组中获取 XML 元素的值

c# - 美化 XmlDocument (.NET) 的最佳方法?

java - 更改导航栏颜色,Android

javascript - 如何使嵌入在 HTML 中的 SVG 加载其 xlink :href dependencies?

html - 如何使用 XSLT 将 HTML 百分比编码转换为 Unicode?

asp.net - Web.config转换作为第一个子项插入

xslt - XSLT 2.0如何在输出的tokenize()中测试position()

java - 用于编辑与其他元素中包含的名称和值相同的单个子元素的 xpath 查询

xpath - 比较XPath中的多个字符串

PHP 获取 DOMNode 的 XPath