在 LyX/Latex 中导入 XML 文件的元素

在 LyX/Latex 中导入 XML 文件的元素

我有一个软件,它创建 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 中。它起作用了!

相关内容