0

ソース XML:

<?xml version="1.0" encoding="UTF-8"?>
<BigData version="2.1" xmlns="bank.xsd">
<InsideData type="plan" name="testBANK" id="10">
<header>
  <log dateTime="2013-07-27T15:52:30"/>
</header>
<object class="BANK"  distName="CITY-1/ABC-1/BANK-1" operation="create"  timeStamp="2013-07-27T15:48:20"/>

<object class="BranchItemPeriod"  distName="CITY-1/ABC-1/BANK-1/Branch-1/BranchItem-1/BranchItemPeriod-1" operation="create"  timeStamp="2013-07-27T15:51:25">
  <p name="Week">0</p>
  <p name="interval">10</p>
</object>

<object class="BranchItemPeriod"  distName="CITY-1/ABC-1/BANK-1/Branch-1/BranchItem-2/BranchItemPeriod-2" operation="update"  timeStamp="2013-07-27T15:51:25">
  <p name="Week">0</p>
  <p name="interval">10</p>
</object>

<object class="Branch" distName="CITY-1/ABC-1/BANK-1/Branch-1" operation="create"  timeStamp="2013-07-27T15:48:31"/>

<object class="BranchItem"  distName="CITY-1/ABC-1/BANK-1/Branch-1/BranchItem-1" operation="create"  timeStamp="2013-07-27T15:50:42">
  <p name="openDate">2013-07-27</p>
  <p name="closeDate">2013-07-29</p>
</object>

<object class="BranchItem"  distName="CITY-1/ABC-1/BANK-1/Branch-1/BranchItem-2" operation="update"  timeStamp="2013-07-27T15:50:42">
  <p name="openDate">2013-07-27</p>
  <p name="closeDate">2013-07-29</p>
</object>

<object class="Sleep"  distName="CITY-1/ABC-1/Sleep-1" operation="create"  timeStamp="2013-07-27T15:50:42">
  <p name="openDate">2013-07-27</p>
  <p name="closeDate">2013-07-29</p>
</object>
<object class="Dance"  distName="CITY-1/ABC-1/Dance-5" operation="create"  timeStamp="2013-07-27T15:50:42">
  <p name="openDate">2013-07-27</p>
  <p name="closeDate">2013-07-29</p>
</object>

</InsideData>
</BigData>

変換 XSL :

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:x="bank.xsd" exclude-result-prefixes="x">

<xsl:output encoding="UTF-8" indent="yes" method="xml"/>

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

<xsl:template match="x:object[@class = 'BANK' ]">
</xsl:template>

<xsl:template match="x:object[@class = 'Branch' ]">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:attribute name="distName">
            <xsl:value-of select="concat(substring-before( @distName,'BANK-1/' ), substring-after( @distName, 'BANK-1/'))"/>
        </xsl:attribute>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="x:object[@class = 'BranchItem' ]">
    <xsl:variable name="branchItem" select="."/>
    <xsl:choose>
        <xsl:when test="$branchItem/@operation='update' and not(contains($branchItem/@distName, 'JOBS_CREATED_USING_NE_LOCAL_UI'))">
            <xsl:copy>
                <xsl:apply-templates select="@*"/>
                <xsl:attribute name="operation">delete</xsl:attribute>
                <xsl:attribute name="distName">
                    <xsl:value-of select="concat(substring-before( @distName,'BANK-1/' ), substring-after( @distName, 'BANK-1/'))"/>
                </xsl:attribute>
                <xsl:apply-templates select="node()"/>
            </xsl:copy>
            <xsl:copy>
                <xsl:apply-templates select="@*"/>
                <xsl:attribute name="operation">create</xsl:attribute>
                <xsl:attribute name="distName">
                    <xsl:value-of select="concat(substring-before( @distName,'BANK-1/' ), substring-after( @distName, 'BANK-1/'))"/>
                </xsl:attribute>
                <xsl:apply-templates select="node()"/>
            </xsl:copy>
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy>
                <xsl:apply-templates select="@*"/>
                <xsl:attribute name="distName">
                    <xsl:value-of select="concat(substring-before( @distName,'BANK-1/' ), substring-after( @distName, 'BANK-1/'))"/>
                </xsl:attribute>
                <xsl:apply-templates select="node()"/>
            </xsl:copy>
        </xsl:otherwise>
    </xsl:choose>

</xsl:template>

<xsl:template match="x:object[@class = 'BranchItemPeriod' ]">
    <xsl:variable name="branchPeiod" select="."/>
    <xsl:choose>
        <xsl:when test="$branchPeiod/@operation='update' and not(contains($branchPeiod/@distName, 'JOBS_CREATED_USING_NE_LOCAL_UI'))">
            <xsl:copy>
                <xsl:apply-templates select="@*"/>
                <xsl:attribute name="operation">create</xsl:attribute>
                <xsl:attribute name="distName">
                    <xsl:value-of select="concat(substring-before( @distName,'BANK-1/' ), substring-after( @distName, 'BANK-1/'))"/>
                </xsl:attribute>
                <xsl:apply-templates select="node()"/>
            </xsl:copy>
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy>
                <xsl:apply-templates select="@*"/>
                <xsl:attribute name="distName">
                    <xsl:value-of select="concat(substring-before( @distName,'BANK-1/' ), substring-after( @distName, 'BANK-1/'))"/>
                </xsl:attribute>
                <xsl:apply-templates select="node()"/>
            </xsl:copy>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

</xsl:stylesheet>

出力 XML :

<?xml version="1.0" encoding="UTF-8"?>
<BigData xmlns="bank.xsd" version="2.1">
<InsideData type="plan" name="testBANK" id="10">
<header>
  <log dateTime="2013-07-27T15:52:30"/>
</header>
<object class="BranchItemPeriod" distName="CITY-1/ABC-1/Branch-1/BranchItem-1/BranchItemPeriod-1" operation="create" timeStamp="2013-07-27T15:51:25">
  <p name="Week">0</p>
  <p name="interval">10</p>
</object>

<object class="BranchItemPeriod" distName="CITY-1/ABC-1/Branch-1/BranchItem-2/BranchItemPeriod-2" operation="create" timeStamp="2013-07-27T15:51:25">
  <p name="Week">0</p>
  <p name="interval">10</p>
</object>

<object class="Branch" distName="CITY-1/ABC-1/Branch-1" operation="create" timeStamp="2013-07-27T15:48:31"/>

<object class="BranchItem" distName="CITY-1/ABC-1/Branch-1/BranchItem-1" operation="create" timeStamp="2013-07-27T15:50:42">
  <p name="openDate">2013-07-27</p>
  <p name="closeDate">2013-07-29</p>
</object>

<object class="BranchItem" distName="CITY-1/ABC-1/Branch-1/BranchItem-2" operation="delete" timeStamp="2013-07-27T15:50:42">
  <p name="openDate">2013-07-27</p>
  <p name="closeDate">2013-07-29</p>
</object>
<object class="BranchItem" distName="CITY-1/ABC-1/Branch-1/BranchItem-2" operation="create" timeStamp="2013-07-27T15:50:42">
  <p name="openDate">2013-07-27</p>
  <p name="closeDate">2013-07-29</p>
</object>

<object class="Sleep" distName="CITY-1/ABC-1/Sleep-1" operation="create" timeStamp="2013-07-27T15:50:42">
  <p name="openDate">2013-07-27</p>
  <p name="closeDate">2013-07-29</p>
</object>
<object class="Dance" distName="CITY-1/ABC-1/Dance-5" operation="create" timeStamp="2013-07-27T15:50:42">
  <p name="openDate">2013-07-27</p>
  <p name="closeDate">2013-07-29</p>
</object>

</InsideData>
</BigData>

必要な出力 XML:

<?xml version="1.0" encoding="UTF-8"?>
<BigData xmlns="bank.xsd" version="2.1">
<InsideData type="plan" name="testBANK" id="10">
    <header>
        <log dateTime="2013-07-27T15:52:30"/>
    </header>

    <object class="Branch" distName="CITY-1/ABC-1/Branch-1" operation="create" timeStamp="2013-07-27T15:48:31"/>

    <object class="BranchItem" distName="CITY-1/ABC-1/Branch-1/BranchItem-1" operation="create" timeStamp="2013-07-27T15:50:42">
        <p name="openDate">2013-07-27</p>
        <p name="closeDate">2013-07-29</p>
    </object>

    <object class="BranchItemPeriod" distName="CITY-1/ABC-1/Branch-1/BranchItem-1/BranchItemPeriod-1" operation="create" timeStamp="2013-07-27T15:51:25">
        <p name="Week">0</p>
        <p name="interval">10</p>
    </object>

    <object class="BranchItem" distName="CITY-1/ABC-1/Branch-1/BranchItem-2" operation="delete" timeStamp="2013-07-27T15:50:42">
        <p name="openDate">2013-07-27</p>
        <p name="closeDate">2013-07-29</p>
    </object>

    <object class="BranchItem" distName="CITY-1/ABC-1/Branch-1/BranchItem-2" operation="create" timeStamp="2013-07-27T15:50:42">
        <p name="openDate">2013-07-27</p>
        <p name="closeDate">2013-07-29</p>
    </object>

    <object class="BranchItemPeriod" distName="CITY-1/ABC-1/Branch-1/BranchItem-2/BranchItemPeriod-2" operation="create" timeStamp="2013-07-27T15:51:25">
        <p name="Week">0</p>
        <p name="interval">10</p>
    </object>

    <object class="Sleep" distName="CITY-1/ABC-1/Sleep-1" operation="create" timeStamp="2013-07-27T15:50:42">
        <p name="openDate">2013-07-27</p>
        <p name="closeDate">2013-07-29</p>
    </object>
    <object class="Dance" distName="CITY-1/ABC-1/Dance-5" operation="create" timeStamp="2013-07-27T15:50:42">
        <p name="openDate">2013-07-27</p>
        <p name="closeDate">2013-07-29</p>
    </object>

</InsideData>
</BigData>

いくつかを除いて、必要な出力のほとんどを達成できました...

  1. オブジェクト ノードのdistName属性に基づいて出力を並べ替えます。
  2. BranchBranchItemBranchItemPeriodなどのクラス名を持つ特定の子ノードに対してのみ並べ替えが行われるようにします。
  3. ここでは、削除作成の操作で更新を試みます。そのため、現在の変換ロジックで行っている削除作成の順序も維持したいと考えています。そうしないと、上記の基準に基づいて最初にすべてを並べ替えて、他のものを適用することができます。変換ロジック。

どんな提案や助けも大歓迎です。

4

1 に答える 1

1

ここで必要なのは、必要な順序で子オブジェクト要素を選択できるInsideData要素に一致するテンプレートだと思います。

最初に、非「オブジェクト」要素を出力することから始めます。これらの要素が常にオブジェクト要素の前に来ると仮定します。

 <xsl:apply-templates select="@*|node()[not(self::x:object)]"/>

次に、必要なクラス属性を持つオブジェクト要素を選択し、必要な順序で並べ替えます。

 <xsl:apply-templates select="x:object[@class='Branch' or @class='BranchItem' or @class='BranchItemPeriod']">
    <xsl:sort select="@distName"/>
 </xsl:apply-templates>

最後に、クラス属性を持つオブジェクト要素を出力します。

 <xsl:apply-templates select="x:object[not(@class='Branch' or @class='BranchItem' or @class='BranchItemPeriod')]"/>

このテンプレートを XSLT に追加して、うまくいくかどうかを確認してください。

  <xsl:template match="x:InsideData">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()[not(self::x:object)]"/>
      <xsl:apply-templates select="x:object[@class='Branch' or @class='BranchItem' or @class='BranchItemPeriod']">
        <xsl:sort select="@distName"/>
      </xsl:apply-templates>
      <xsl:apply-templates select="x:object[not(@class='Branch' or @class='BranchItem' or @class='BranchItemPeriod')]"/>
    </xsl:copy>
  </xsl:template>
于 2013-08-08T12:53:49.183 に答える