如何在找到某个模式时添加空格?

时间:2010-05-25 02:18:30

标签: xslt

我在找到一种在两个子元素之间添加空格的方法时遇到了一个主要问题。

<aaa>
    I want to add <bbb>a</bbb><ccc>space</ccc> between two words.
</aaa>

如果ccc元素立即跟随bbb元素,我想在“a”和“space”字之间添加一个空格。目前,我在aaa元素级别应用模板,然后在单独的模板中处理bbb和ccc元素。

我不知道如何提前检测这个</bbb><ccc>模式。

注意:我不知道bbb和ccc元素中会包含哪些单词。

1 个答案:

答案 0 :(得分:2)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="node()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
   "b[. = 'a'
   and
    following-sibling::node()
                    [1]
                    [self::i
                   and
                     . = 'boy'
                    ]
      ]
   ">
   <xsl:call-template name="identity"/>
   <xsl:text> </xsl:text>
 </xsl:template>
</xsl:stylesheet>
在提供的XML文档上执行

<aaa>
    I am <b>a</b><i>boy</i>.
</aaa>

生成想要的正确结果

<aaa>
    I am <b>a</b> <i>boy</i>.
</aaa>

请注意

  1. 使用身份规则复制所有节点。

  2. 使用特定模板覆盖标识规则,以在指定的<b><i>节点之间准确添加空格字符。

  3. 匹配(XPath表达式)模式,用于精确匹配要插入空格的所需<b>节点。

  4. 模板规则的代码重用,均按名称应用和调用。