我是一名 Python 初学者,想要将现有的 xml 文件转换为 LaTeX 文档。 xml 包含许多脚注,有时会被拆分 - 因为它们不适合原始文档(一本旧书)中的一页,并且 xml 文件的创建者希望布局尽可能接近原始文档。在分割的脚注之间有普通文本以及其他脚注......
下面的代码应该可以清楚地说明脚注之间的关系:
> normal text <note place="foot" n="(a)" xml:id="seg2pn_8_1"
> next="#seg2pn_8_2">aaa aaa aaa</note> normal text <note place="foot"
> n="(b)">footnote text</note>. normal text. <note place="foot" n="(a)"
> xml:id="seg2pn_8_2" prev="#seg2pn_8_1">bbb bbb bbb</note>
期望的输出是:
normal text \footnote{aaa aaa aaa bbb bbb bbb} normal text \footnote{footnote text}. normal text.
所有内容都可以位于注释的两个部分之间:普通文本、其他注释等。
使用正则表达式的lookbehind和lookahead以及pythons zip方法我能够打印所需的结果:但我无法进行实际的替换并将结果写入第二个文件:
#!/usr/bin/env python3
import re
import sys
inFile = sys.argv[1]
with open(inFile,'r') as f:
fin = f.read()
strings_first = (re.findall('(?<=seg2pn_\d{1}_2">).*?(?=</note>)', fin, flags=re.DOTALL))
strings_second = (re.findall('(?<=seg2pn_\d{1}_1">).*?(?=</note>)', fin, flags=re.DOTALL))
for t, y in zip(strings_first, strings_second):
print(t + y)
如果您对 XSLT 解决方案感兴趣,那么它非常简单。只需使用添加的规则进行身份转换:
<xsl:template match="note[@place='foot'][@next]">
<xsl:copy>
<xsl:value-of select="."/>
<xsl:value-of select="id(substring(@next, 2))"/>
</xsl:copy>
</xsl:template>
<xsl:template match="note[@place='foot'][@prev]"/>
这将脚注清理分为一个单独的处理阶段,这始终是保持此类应用程序逻辑简单的好主意。
我假设脚注永远不会分成两个以上的部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)