在我的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样式表的任何想法?我会在这里使用正则表达式来帮助我匹配章节#?
提前致谢。
答案 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等)。