XML 파일을 처리하려고합니다. 특정 특성이있는 일부 요소는 새 요소의 하위 요소 여야합니다. 일치하지 않는 요소의 다른 형제도 거기에 그대로 있어야합니다. 좋은 예가 될 것입니다.일치하는 요소를 그대로 새 요소에 추가합니다.
일치시키려는 토큰의 속성은 id = 't_15'이고 id는 't_16'입니다.
<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">
<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>
이것은 내가 사용하고있는 스타일입니다 :
<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>
이 내가 좀하고 싶습니다 출력은 다음과 같습니다
이
는 입력 XML이다 그리고 이것이 마침내 내가 얻는 결과입니다 : 특정 속성개<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 솔루션을 선호한다. XSLT 1.0 만 지원하는 lxml을 사용하여 파이썬 스크립트에 통합하고 싶습니다. –
Ian의 솔루션을 사용해 보았습니다. 정확히 찾고자하지만 XSLT 2.0입니다. 이제, 나는 그의 제안을 더 이상 볼 수 없지만 그것은 아주 좋았다. –
다음번에 뭔가를 물어 보면 올바른 버전을 사용하고 있는지 확인하십시오. 이것은 내가 말하기에 상당히 성가신 일이다. –