Python XSLT XML 中的身份转换合并索引属性之间的文本

Identiy Transform in Python XSLT XML merging text between indexed attributes

我想合并在一个巨大的 xml 文档中拆分为相应属性的文本。我认为我可以使用正则表达式来做到这一点(将一个字符串移动到另一个字符串末尾的字符串之间)但是作为 这将是一个糟糕的武器选择,并且建议使用 XSLT。现在我对 xslt 和解析一无所知,但我开始使用 python,我认为这应该可以使用 python。这是我输入的内容:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="footnotes.xsl"?>
<start>
<p>
vielen Delicten mit großer Conſequenz durchgeführt
<note place="foot" n="(h)" xml:id="seg2pn_2_1" next="#seg2pn_2_2">aaa <hi rendition="#aq">some text</hi> <hi rendition="#g">aaa</hi></note>
. —
<lb/>
Ganz dieſelben Grundſätze aber gelten auch bey ſolchen
<lb/>
Obligationen, deren erſte Entſtehung nicht in einem De-
<lb/>
lict, ſondern in einem Vertrag u. ſ. w., enthalten iſt, wo-
<lb/>
bey aber die einzelne Anwendung der Klage auf einen
<lb/>
<lb/>
Dolus ſich gründet
. — Und eben ſo werden dieſe Grund-
<lb/>
ſätze auch auf die Beſtrafung öffentlicher Verbrechen an-
<lb/>
gewendet, bey welchen ganz beſonders hervorgehoben wird,
<lb/>
daß die Zurechnung von der mehr oder weniger einfachen
<lb/>
und leicht einzuſehenden Natur des Verbrechens abhängig
<lb/>
ſeyn ſoll

</p>
<lb/>
<p>
<hi rendition="#aq">III.</hi>
Bey der
<hi rendition="#g">Auflöſung der Obligationen</hi>
iſt
<lb/>
die Anwendung des Grundſatzes einfach und unbedenklich.
<lb/>
Der Unmündige kann einen Erlaßvertrag ſchließen: wenn
<lb/>
er Schuldner iſt für ſich allein, als Glaubiger aber nur
<lb/>
mit dem Tutor
<note place="foot" n="(l)">
<hi rendition="#aq">
<hi rendition="#i">L.</hi>
28
<hi rendition="#i">pr. de pactis</hi>
</hi>
(2. 14.).
</note>
. — Zahlung leiſten würde er können,
<lb/>
weil er dadurch Befreyung erwirbt: dennoch kann er es
<lb/>
nicht ohne Tutor, weil es nicht geſchehen kann ohne Ver-
<lb/>
äußerung des Geldes. Ganz eben ſo verhält es ſich mit
<lb/>
dem Empfang einer Zahlung, wodurch er zwar Geld er-
<lb/>
wirbt, auf der andern Seite aber auch eine Forderung
<lb/>
verliert
<note place="foot" n="(m)" xml:id="seg2pn_3_1" next="#seg2pn_3_2">some text CCC some text</note>
.
</p>
<lb/>
<p>
<note place="foot" n="(h)" xml:id="seg2pn_2_2" prev="#seg2pn_2_1"><hi rendition="#aq">bbb</hi> <hi rendition="#g">some text bbb</hi></note>
</p>
<lb/>

<lb/>
<p>
<hi rendition="#aq">IV.</hi>
Die
<hi rendition="#g">Prozeßführung</hi>
, der Unmündige mag nun
<lb/>
Kläger oder Beklagter ſeyn, iſt wegen des ungewiſſen
<lb/>
Ausgangs ſtets ein gefährliches Geſchäft; daher iſt dazu
<lb/>
der Unmündige fähig nur mit Genehmigung des Tutors

</p>
<lb/>
<lb/>
<p>
<hi rendition="#aq">VI.</hi>
<hi rendition="#g">Sponſalien</hi>
ſchließen kann der Unmündige für
<lb/>
ſich allein

, welches ſo zu erklären iſt. Steht er in
<lb/>
väterlicher Gewalt, ſo iſt er ohnehin, auch unabhängig
<lb/>
von dem unreifen Alter, an des Vaters Einwilligung ſtreng
<lb/>
gebunden. Iſt er unabhängig, ſo konnte freylich die Ge-
<lb/>
nehmigung des Tutors nicht aushelfen, da dieſe ſich nur
<lb/>
auf das Vermögen bezieht, womit die Sponſalien nicht in
<lb/>
Verbindung ſtehen. Man möchte alſo, nach der Analogie
<lb/>
<note place="foot" n="(m)" xml:id="seg2pn_3_2" prev="#seg2pn_3_1">DDD <hi rendition="#aq">some Text</hi> <hi rendition="#g">DDD</hi> </note>
<lb/>
<pb n="46" facs="#f0058"/>
Buch
<hi rendition="#aq">II.</hi>
Rechtsverhältniſſe. Kap.
<hi rendition="#aq">III.</hi>

</p>
</start>

期望的输出:应该合并之前分开的脚注+应该标记合并的位置。像这样:

<note place="foot" n="(h)" xml:id="seg2pn_2_1" next="#seg2pn_2_2">aaa <hi rendition="#aq">some text</hi> <hi rendition="#g">aaa</hi>∀<hi rendition="#aq">bbb</hi> <hi rendition="#g">some text bbb</hi></note>

请注意,脚注文本可以采用多种方式进行格式化 - 属性

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<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]"/>
</xsl:stylesheet>

所以我的问题是:python 脚本如何将所需的输出写入新的 xml 文件?

这会生成您期望的输出吗?

import lxml.etree

xml_in  = 'footnotes.xml'
xml_out = 'result.xml'

xslt = lxml.etree.fromstring('''
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

    <!--Identity Transform.-->
    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <!--do nothing for <note prev=""> tags-->
    <xsl:template match="note[@place='foot'][@prev]"/>

    <xsl:template match="note[@place='foot'][@next]">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        <xsl:text>∀</xsl:text>
        <xsl:copy-of select="id(substring(@next, 2))/node()"/>
      </xsl:copy>
    </xsl:template>
  </xsl:stylesheet>'''
)


doc = lxml.etree.parse(xml_in)

with open(xml_out, 'w') as f:
    print(str(doc.xslt(xslt)), file=f)

之前:

<note place="foot" n="(h)" xml:id="seg2pn_2_1" next="#seg2pn_2_2">
  aaa1 <hi rendition="#aq">some text</hi> <hi rendition="#g">aaa2</hi>
</note>
<note place="foot" n="(m)" xml:id="seg2pn_3_1" next="#seg2pn_3_2">
  some text CCC some text
</note>
<note place="foot" n="(h)" xml:id="seg2pn_2_2" prev="#seg2pn_2_1">
  <hi rendition="#aq">bbb1</hi> <hi rendition="#g">some text bbb2</hi>
</note>
<note place="foot" n="(m)" xml:id="seg2pn_3_2" prev="#seg2pn_3_1">
  DDD1 <hi rendition="#aq">some Text</hi> <hi rendition="#g">DDD2</hi>
</note>
<note place="foot" n="(ii)" xml:id="seg2pn_10_10" next="#seg2pn_10_11">
  one one one
</note>
<note place="foot" n="(ii)" xml:id="seg2pn_10_11" prev="#seg2pn_10_10">
  two two two
</note>

之后:

<note place="foot" n="(h)" xml:id="seg2pn_2_1" next="#seg2pn_2_2">
  aaa1 <hi rendition="#aq">some text</hi> <hi rendition="#g">aaa2</hi>
  ∀
  <hi rendition="#aq">bbb1</hi> <hi rendition="#g">some text bbb2</hi>
</note>

<note place="foot" n="(m)" xml:id="seg2pn_3_1" next="#seg2pn_3_2">
  some text CCC some text
  ∀
  DDD1 <hi rendition="#aq">some Text</hi> <hi rendition="#g">DDD2</hi>
</note>

<note place="foot" n="(ii)" xml:id="seg2pn_10_10" next="#seg2pn_10_11">
  one one one
  ∀
  two two two
</note>