我有一个软件,它创建 XML 文件,其结构如下:
<model>
<dims>
<dim type="attr" name="foo">
<def>Insert Definition of the Dimension 'foo'</def>
<hiers>
<hier name="foo">
<def>Insert Definition of the Hierarchy 'foo'</def>
<lvlrol lname="bar"/>
</hier>
</hiers>
<lvls>
<lvl tag="bar" name="bar">
<def>Insert Definition of the Level 'bar'</def>
</lvl>
</lvls>
</dim>
<dim type="attr" name="baz">
<def>Definition of baz</def>
[...]
</dim>
</dims>
</model>
现在我想<def>
从Lyx 中的每个定义(或者至少从 Latex 中的<dim>
每个定义)导入定义()。<hier>
Lyx 文档应为每个内容都设置一个(子)章节,<dim>
在其中<hier>
解释所有相应的内容。这些章节应仅根据 XML 文件的定义创建。
我该怎么做?我知道如何将整个 XML 文件放入 Latex 中(将 XML 文件包含到 LaTeX 中),但我只想连续导入所有定义。
答案1
使用您的xsl
文件,您将从 xml 转换为 html。但您也可以使用标签将其转换为纯 ascii 文本或 latex <xsl:text>
。以下是相应的xsl
文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:text>
\documentclass{article}
\begin{document}
</xsl:text>
<xsl:for-each select="model/dims/dim">
<xsl:text>\section{</xsl:text><xsl:value-of select="@name"/><xsl:text>}
</xsl:text>
<xsl:value-of select="def"/><xsl:text>
</xsl:text>
<xsl:for-each select="lvls/lvl">
<xsl:text>\subsection{</xsl:text><xsl:value-of select="@name"/><xsl:text>}
</xsl:text>
<xsl:value-of select="def"/><xsl:text>
</xsl:text>
</xsl:for-each> </xsl:for-each>
<xsl:text>
\end{document}
</xsl:text>
</xsl:template>
</xsl:stylesheet>
您可以在命令行上处理它,例如xsltproc
:
xsltproc -o output.tex template.xsl input.xml
我从未真正使用过 Lyx。它支持自定义插件或类似的东西吗?
答案2
解决方案的最终链接是 xsltproc。
首先我创建了一个包含 latex 命令的 XSL:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:for-each select="model/dims/dim">
<xsl:text>\section{</xsl:text>
<xsl:value-of select="@name"/>
<xsl:text>}</xsl:text>
<xsl:value-of select="def"/>
<xsl:for-each select="hiers/hier">
<xsl:text>\subsection*{</xsl:text>
<xsl:value-of select="@name"/>
<xsl:text>}</xsl:text>
<xsl:value-of select="def"/>
</xsl:for-each>
<xsl:for-each select="lvls/lvl">
<xsl:text>\subsection*{</xsl:text>
<xsl:value-of select="@name"/>
<xsl:text>}</xsl:text>
<xsl:value-of select="def"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
请注意,没有\begin{document}
或,\end{document}
因为我在另一个子文档(已是包含的文档)中使用了 LyX 的输入功能。要创建独立的 tex 文件,需要添加这些命令。
其次,我用 xsltproc 创建了一个 tex 文件:
xsltproc above.xsl input.xml -o output.tex
它给了我一个unable to parse output.tex
,但它仍然有效。
第三,我将这个 output.tex 包含在 LyX 中。它起作用了!