-2

削除したい子要素名をハードコーディングする必要を避けるために、一致する親要素名が見つかったときに子要素を削除する動的プロセスを作成したいと考えています。

私のXMLファイル:

<A>
    <B1>
        <C>C</C>
        <D>D</D>
        <E>E</E>
        <H>H</H>
        <MOD>
            <C>C</C>
            <D>D</D>
            <E>E</E>
            <F>F</F>
            <G>G</G>
        </MOD>
    </B1>
    <B2>
        <C>C</C>
        <E>E</E>
        <H>H</H>
        <MOD>
            <C>C</C>
            <D>D</D>
            <E>E</E>
            <F>F</F>
            <G>G</G>
        </MOD>
    </B2>
    <B3>
        <D>D</D>
        <E>E</E>
        <H>H</H>
        <X>X</X>
        <MOD>
            <C>C</C>
            <D>D</D>
            <E>E</E>
            <F>F</F>
            <G>G</G>
            <X>G</X>
        </MOD>
    </B3>
</A>

望ましい出力:

私のXMLファイル:

<A>
    <B1>
        <C>C</C>
        <D>D</D>
        <E>E</E>
        <H>H</H>
        <MOD>
            <F>F</F>
            <G>G</G>
        </MOD>
    </B1>
    <B2>
        <C>C</C>
        <E>E</E>
        <H>H</H>
        <MOD>
            <D>D</D>
            <F>F</F>
            <G>G</G>
        </MOD>
    </B2>
    <B3>
        <D>D</D>
        <E>E</E>
        <H>H</H>
        <X>X</X>
        <MOD>
            <C>C</C>
            <F>F</F>
            <G>G</G>
        </MOD>
    </B3>
</A>

私の XSLT

     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
            exclude-result-prefixes="xs">
    <xsl:strip-space elements="*"/>
    <!-- copy all nodes -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <!-- Remove child elements but keep parent element with same name -->
    <xsl:template match="C[../ancestor::*/C]"/>
    <xsl:template match="D[../ancestor::*/D]"/>
    <xsl:template match="E[../ancestor::*/E]"/>
</xsl:stylesheet>

このように削除要素コードを組み合わせることができると思います

<xsl:template match="C|D|E[../ancestor::*/C|D|E]"/>

開始方法はわかりませんが、プロセスは親ノード名 (C、D、E、H) を取得し、親ノード名を各子ノード名と比較して子を循環する必要があると考えています。一致が見つかったら、子要素を削除します。ありがとう。

4

2 に答える 2

1

私が知る限り、このスタイルシートは必要なことを行います。同じ名前の前に兄弟を持つ親を持つ要素を除外することにより、必要と言うものに一致する出力を生成します。

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

  <xsl:strip-space elements="*"/>
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="*">
    <xsl:if test="not(parent::*/preceding-sibling::*[name() = name(current())])">
      <xsl:copy>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>
于 2013-05-13T20:55:20.627 に答える