私はこの入力を持っています:
<root>
<sector>
<nodeA id="a">
<section id="i">
<item1 id="1" method="delete"/>
<item1 id="1" method="create">
<somechild>a</somechild>
</item1>
<item1 id="1" method="change">
<somechild>a</somechild>
</item1>
</section>
<section id="i">
<item1 id="1" method="change">
<somechild>a</somechild>
</item1>
</section>
<section id="i">
<item1 id="1" method="delete"/>
<item1 id="1" method="create">
<somechild>a</somechild>
</item1>
</section>
</nodeA>
</sector>
</root>
私のXSLは:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*[not(.//*[@id!=''])][@method='delete']">
<xsl:if test="not(following::*[not(.//*[@id!=''])][@id=current()/@id][../@id = current()/../@id][generate-id(../..) = generate-id(current()/../..)])"/>
</xsl:template>
<xsl:template match="*[not(.//*[@id!=''])][@method!='delete']">
<xsl:if test="not(following::*[not(.//*[@id!=''])][@method='delete'][@id=current()/@id][../@id = current()/../@id][generate-id(../..) = generate-id(current()/../..)])"/>
</xsl:template>
<xsl:template match="@*|node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
私の出力:
<root>
<sector>
<nodeA id="a">
<section id="i">
</section>
<section id="i">
</section>
<section id="i">
</section>
</nodeA>
</sector>
</root>
期待される出力:
<root>
<sector>
<nodeA id="a">
<section id="i">
<item1 id="1" method="delete"/> <!-- leave this node -->
</section>
<section id="i">
</section>
<section id="i">
<item1 id="1" method="create"> <!-- leave this node -->
<somechild>a</somechild>
</item1>
</section>
</nodeA>
</sector>
</root>
アイデアは、要素ノードとの組み合わせを削除したいということです
- 1 つのメソッド create の後に1 つまたは複数の変更が続き、その後に1 つのdelete メソッドが続き、残りはそのままにしておきます。
- たとえば、同じ要素名である必要があり
<item1>
、@id
同じ親の下にある必要があります<section id=1>
。
誰でも変換を手伝ってもらえますか?
ありがとう。ジョン