我想處理一個XML文件,我知道某些具有特定屬性的元素應該是新元素的子元素。其他不匹配的元素的其他兄弟應該保持不變。一個例子會更好。將匹配的元素添加到新元素,同時保持那些不匹配,因爲它們是
我想匹配的令牌具有屬性id ='t_15'和id ='t_16'。
這是輸入XML:
<text>
<div id="d_1">
<p id="p_1">
<s id="s_1">
<token id="t_13" lemma="colleague" pos="NN">Colleagues</token>
<token id="t_14" lemma="," pos=",">,</token>
<token id="t_15" lemma="we" pos="PP">we</token>
<token id="t_16" lemma="now" pos="RB">now</token>
<token id="t_17" lemma="come" pos="VVP">come</token>
<token id="t_18" lemma="to" pos="TO">to</token>
<token id="t_19" lemma="catch-the-eye" pos="NN">catch-the-eye</token>
<token id="t_20" lemma="." pos="SENT">.</token>
</s>
<s id="s_2">
<token id="t_21" lemma="these" pos="DT">These</token>
<token id="t_22" lemma="be" pos="VBP">are</token>
<token id="t_23" lemma="the" pos="DT">the</token>
<token id="t_24" lemma="name" pos="NNS">names</token>
<token id="t_25" lemma="I" pos="PP">I</token>
<token id="t_26" lemma="will" pos="MD">will</token>
<token id="t_27" lemma="call" pos="VV">call</token>
<token id="t_28" lemma="out" pos="RP">out</token>
<token id="t_29" lemma="." pos="SENT">.</token>
</s>
</p>
</div>
</text>
這是我希望得到的輸出:
<text>
<div id="d_1">
<p id="p_1">
<s id="s_1">
<token id="t_13" lemma="colleague" pos="NN">Colleagues</token>
<token id="t_14" lemma="," pos=",">,</token>
<e>
<token id="t_15" lemma="we" pos="PP">we</token>
<token id="t_16" lemma="now" pos="RB">now</token>
</e>
<token id="t_17" lemma="come" pos="VVP">come</token>
<token id="t_18" lemma="to" pos="TO">to</token>
<token id="t_19" lemma="catch-the-eye" pos="NN">catch-the-eye</token>
<token id="t_20" lemma="." pos="SENT">.</token>
</s>
<s id="s_2">
<token id="t_21" lemma="these" pos="DT">These</token>
<token id="t_22" lemma="be" pos="VBP">are</token>
<token id="t_23" lemma="the" pos="DT">the</token>
<token id="t_24" lemma="name" pos="NNS">names</token>
<token id="t_25" lemma="I" pos="PP">I</token>
<token id="t_26" lemma="will" pos="MD">will</token>
<token id="t_27" lemma="call" pos="VV">call</token>
<token id="t_28" lemma="out" pos="RP">out</token>
<token id="t_29" lemma="." pos="SENT">.</token>
</s>
</p>
</div>
</text>
這是我使用的樣式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="no"></xsl:output>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"></xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:variable name="dif_tok">
<dif_tok>t_15</dif_tok>
<dif_tok>t_16</dif_tok>
</xsl:variable>
<xsl:template match="s">
<xsl:copy>
<xsl:apply-templates select="@*"></xsl:apply-templates>
<e>
<xsl:copy-of select="*[@id = $dif_tok/dif_tok]"></xsl:copy-of>
</e>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
這是,最後我得到的結果:
個<text>
<div id="d_1">
<p id="p_1">
<s id="s_1"><e><token id="t_15" lemma="we" pos="PP">we</token><token id="t_16" lemma="now" pos="RB">now</token></e></s>
<s id="s_2"><e/></s>
</p>
</div>
</text>
對不起,儘管在原文中我使用了XSLT 2.0聲明(我剛剛編輯過它)。我更喜歡XSLT 1.0解決方案。我想使用lxml將它集成到python腳本中,該腳本僅支持XSLT 1.0 –
我試過Ian的解決方案,它正是我在尋找的,但它是XSLT 2.0。現在,我再也看不到他的建議,但它非常好。 –
下次您提問時,請確保您使用正確的版本。這很令人討厭,我不得不說。 –