匹配文本节点中的数字字符并将其更改为属性

时间:2012-09-21 20:48:22

标签: xml xslt xpath

在我的XHTML中遇到此XSL转换问题。

我的源文档说明:

<blockquote>
    <center>
       <h1>CHAPTER 100. RANDOM TEXT HERE </h1>
    </center>
    <center>
       <h1>CHAPTER 200. RANDOM TEXT HERE </h1>
    </center>
</blockquote>

我想要的输出:

<title chapter="100"> CHAPTER 100. RULES OF SOMETHING TEXT HERE </title>
<title chapter="200"> CHAPTER 200. RULES OF SOMETHING TEXT HERE </title>

有关如何将此添加到我的XSLT样式表的任何想法?我会在这里使用正则表达式来帮助我匹配章节#?

提前致谢。

3 个答案:

答案 0 :(得分:3)

好吧,它会涉及类似

的内容
<xsl:template match="h1">
  <title chapter="{replace(., 'CHAPTER\s+(\d+)', '$1')}">
    <xsl:apply-templates/>
  </title>
</xsl:template>

答案 1 :(得分:1)

根据显示的表单输入,在XSLT 1.0中你可以做这样的事情(未经测试):

<xsl:template match="h1">
  <title chapter="{
      substring-before(
        substring-after(.,'CHAPTER '),
        '. '
      )}">
    <xsl:apply-templates/>
  </title>
</xsl:template>

这可能会对不规则输入产生次优结果。

在XSLT 2.0中,您(正如Michael Kay刚刚观察到的那样)拥有更丰富的正则表达式函数,这些函数可以让您更方便地处理输入中的一些不规则性; matches()tokenize()replace()函数值得一读。

答案 2 :(得分:0)

假设源是HTML,您希望将其转换为纯XML。

我会将整个源文档加载到DOM树中,然后从那里创建目标XML。几乎所有语言都有办法将字符串或文件中的源读取到DOM树中。 SAX解析器也可用于此目的,只需编写解析器的代码即可将输入转换为所需的输出。

我猜也可以用正则表达式来完成,但没有办法检查输出的有效性,使用真正的树/解析器具有所有这些功能(天气DOM / SAX等)。