0

以下のようなxmlがあります:

<?xml version="1.0" encoding="UTF-8"?>
<Object>
<Data type="plan" name="testAom" id="10">

    <obj class="D" version="1.0" distName="A-1/B-1/C-1/D-1" operation="create" >
        <p name="Active">1</p>
        <p name="Type">CPU</p>
        <p name="StDate">2013-07-27T00:00:00+00:00</p>
        <p name="StpDate">2013-07-29T00:00:00+00:00</p>
    </obj>

    <obj class="E" version="1.0" distName="A-1/B-1/C-1/D-1/E-1" operation="create">
        <p name="dayOfWeek">0</p>
        <p name="interval">10</p>
    </obj>

    <obj class="E" version="1.0" distName="A-1/B-1/C-1/D-2/E-1" operation="update">
        <p name="dayOfWeek">0</p>
        <p name="interval">10</p>
    </obj>

    <obj class="D" version="1.0" distName="A-1/B-1/C-1/D-2" operation="update">
        <p name="Active">1</p>
        <p name="Type">CPU</p>
        <p name="StDate">2013-07-27T00:00:00+00:00</p>
        <p name="StpDate">2013-07-29T00:00:00+00:00</p>
    </obj>
</Data>
</Object>

ここで、入力ソース ファイルの順序は保証されません。しかし、XSL 変換後の出力では、出力を特定の順序にする必要があります。

以下は XSL です。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="obj[@class = 'D' ]">
<xsl:variable name="item" select="."/>
<xsl:choose>
    <xsl:when test="$item/@operation='update'">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="operation">delete</xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="operation">create</xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:when>
    <xsl:otherwise>
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="operation">NEW_create</xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template match="obj[@class = 'E' ]">
<xsl:variable name="childitem" select="."/>
<xsl:choose>
    <xsl:when test="$childitem/@operation='update'">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="operation">delete</xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="operation">create</xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:when>
    <xsl:otherwise>
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="operation">NEW_create</xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:otherwise>
</xsl:choose>
</xsl:template>         
</xsl:stylesheet>

私が得る出力は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<Object>
<Data type="plan" name="testAom" id="10">

    <obj class="D" version="1.0" distName="A-1/B-1/C-1/D-1" operation="NEW_create">
        <p name="Active">1</p>
        <p name="Type">CPU</p>
        <p name="StDate">2013-07-27T00:00:00+00:00</p>
        <p name="StpDate">2013-07-29T00:00:00+00:00</p>
    </obj>

    <obj class="E" version="1.0" distName="A-1/B-1/C-1/D-1/E-1" operation="NEW_create">
        <p name="dayOfWeek">0</p>
        <p name="interval">10</p>
    </obj>

    <obj class="E" version="1.0" distName="A-1/B-1/C-1/D-2/E-1" operation="delete">
        <p name="dayOfWeek">0</p>
        <p name="interval">10</p>
    </obj>
    <obj class="E" version="1.0" distName="A-1/B-1/C-1/D-2/E-1" operation="create">
        <p name="dayOfWeek">0</p>
        <p name="interval">10</p>
    </obj>

    <obj class="D" version="1.0" distName="A-1/B-1/C-1/D-2" operation="delete">
        <p name="Active">1</p>
        <p name="Type">CPU</p>
        <p name="StDate">2013-07-27T00:00:00+00:00</p>
        <p name="StpDate">2013-07-29T00:00:00+00:00</p>
    </obj>
    <obj class="D" version="1.0" distName="A-1/B-1/C-1/D-2" operation="create">
        <p name="Active">1</p>
        <p name="Type">CPU</p>
        <p name="StDate">2013-07-27T00:00:00+00:00</p>
        <p name="StpDate">2013-07-29T00:00:00+00:00</p>
    </obj>
</Data>
</Object>

ここで、操作属性が「更新」の場合、削除と作成を行う必要があります。

上記のノードには、属性distNameに基づく親子関係があります。つまり、A-1/B-1/C-1/D-1A-1/B-1/C-1/D-1/E- の親です。 1 . 更新操作が正しく機能するためには、最初に親の作成と削除が必要であり、次に子の削除と作成が常に必要です。

入力ソースxmlファイルの順序に関係なく、これをどのように達成できますか??

すなわち。クラス属性Dを持つ obj ノードは、 Eよりも最初に配置する必要があります。

予期される出力 XML:

<?xml version="1.0"?>
<Object>
<Data type="plan" name="testAom" id="10">
<obj class="D" version="1.0" distName="A-1/B-1/C-1/D-1" operation="NEW_create">
<p name="Active">1</p>
<p name="Type">CPU</p>
<p name="StDate">2013-07-27T00:00:00+00:00</p>
<p name="StpDate">2013-07-29T00:00:00+00:00</p>
</obj>
<obj class="E" version="1.0" distName="A-1/B-1/C-1/D-1/E-1" operation="NEW_create">
<p name="dayOfWeek">0</p>
<p name="interval">10</p>
</obj>
<obj class="D" version="1.0" distName="A-1/B-1/C-1/D-2" operation="delete">
<p name="Active">1</p>
<p name="Type">CPU</p>
<p name="StDate">2013-07-27T00:00:00+00:00</p>
<p name="StpDate">2013-07-29T00:00:00+00:00</p>
</obj><obj class="D" version="1.0" distName="A-1/B-1/C-1/D-2" operation="create">
<p name="Active">1</p>
<p name="Type">CPU</p>
<p name="StDate">2013-07-27T00:00:00+00:00</p>
<p name="StpDate">2013-07-29T00:00:00+00:00</p>
</obj>
<obj class="E" version="1.0" distName="A-1/B-1/C-1/D-2/E-1" operation="delete">
<p name="dayOfWeek">0</p>
<p name="interval">10</p>
</obj><obj class="E" version="1.0" distName="A-1/B-1/C-1/D-2/E-1" operation="create">
<p name="dayOfWeek">0</p>
<p name="interval">10</p>
</obj>
</Data>
</Object>
4

1 に答える 1