1

ここに私のxmlがあります:

<rootNode>
    <sample>
        <DO type="TD" name="ABC" ref="1">
            <text>text</text>
        </DO>
        <DO type="CI" name="DEF" ref="2">
            <text></text>
        </DO>
        <DO type="PL" name="GHI" ref="3">
            <text>text</text>
        </DO>
        <DO type="AB" name="JKL" ref="4">
            <text>text</text>
        </DO>   
    </sample>
    <Docs>
        <Document>
            <type>TD</type>
            <name>ABC</name>
            <ref>1</ref>
            <text>sample text</text>
        </Document>
        <Document>
            <type>CI</type>
            <name>DEF</name>
            <ref>2</ref>
            <text>sample text</text>
        </Document>
        <Document>
            <type>PL</type>
            <name>GHI</name>
            <ref>3</ref>
            <text>sample text</text>
        </Document>
        <Document>
            <type>AB</type>
            <name>JKL</name>
            <ref>4</ref>
            <text>sample text</text>
        </Document>
        <Document>
            <type>CD</type>
            <name>JKL</name>
            <ref>5</ref>
            <text>sample text</text>
        </Document>
    </Docs>
</rootNode>

sample/DO の型、名前、および参照のいずれかが、Docs/Document の型、名前、および参照のいずれかと一致する場合。サンプル/DO/テキストをドキュメント/テキストで更新します。それ以外の場合 (サンプル/Do の type,name, ref のいずれかが Docs/Document の type,name, ref と一致しない場合)、Docs/Document の Document 全体を追加する必要があります。

注: サンプル/DO の順序は変更しないでください。つまり、一致するドキュメントがある場合は、同じものを更新する必要があります。それ以外の場合は、新しいものを追加する必要があります。

4

2 に答える 2

1

ドキュメントのコピーと変換に XSLT を使用している場合は、2 つのxsl:key** を使用して **Document要素とSO要素を検索できます。この場合、複合キーが必要です

<xsl:key name="docs" match="Document" use="concat(type, '|', name, '|', ref)"/>
<xsl:key name="samples" match="DO" use="concat(@type, '|', @name, '|', @ref)"/>

最初に、一致するDocument要素を持つSO要素を次のように一致させることができます

<xsl:template match="DO[key('docs', concat(@type, '|', @name, '|', @ref))]">

(すべてのSO要素が一致する **Document 要素を持つことが保証されている場合、これは次のように簡略化できます<xsl:template match="DO" >)

このテンプレート内で、このテンプレートにコードを追加するだけで、キーのDocument要素からテキスト要素をコピーできます。

対応するSO要素なしでDocument要素を一致させるには、次のようにします。

<xsl:apply-templates 
   select="/rootNode/Docs/Document[not(key('samples', concat(type, '|', name, '|', ref)))]"
   mode="Document"/>

一致するテンプレートについては、それをSO要素に変換できます。

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="docs" match="Document" use="concat(type, '|', name, '|', ref)"/>
   <xsl:key name="samples" match="DO" use="concat(@type, '|', @name, '|', @ref)"/>


   <xsl:template match="DO[key('docs', concat(@type, '|', @name, '|', @ref))]">
      <xsl:copy>
         <xsl:apply-templates select="@*"/>
            <xsl:copy-of select="key('docs', concat(@type, '|', @name, '|', @ref))/text"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="sample">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
         <xsl:apply-templates select="/rootNode/Docs/Document[not(key('samples', concat(type, '|', name, '|', ref)))]" mode="Document"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="Document" mode="Document">
         <DO type="{type}" name="{name}" ref="{ref}">
            <xsl:copy-of select="text" />
         </DO>
   </xsl:template>

   <xsl:template match="Docs" />

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

以下が出力されます

<rootNode>
   <sample>
      <DO type="TD" name="ABC" ref="1">
         <text>sample text</text>
      </DO>
      <DO type="CI" name="DEF" ref="2">
         <text>sample text</text>
      </DO>
      <DO type="PL" name="GHI" ref="3">
         <text>sample text</text>
      </DO>
      <DO type="AB" name="JKL" ref="4">
         <text>sample text</text>
      </DO>
      <DO type="CD" name="JKL" ref="5">
         <text>sample text</text>
      </DO>
   </sample>
</rootNode>

出力からDocsノードを除外したことに注意してください。保持したい場合は、関連する行を XSLT から削除してください。

于 2012-04-21T09:21:31.210 に答える
0

私の知る限り、純粋なxpathを使用するだけではドキュメントを更新できません。xpathの概念は、特定の比較に基づいてドキュメントから特定のノードを選択するために主に使用されます。これを実現する唯一の良い方法は、xpathを使用できる別の言語を使用する必要があり、要素を更新するのはphpSimplexmlのようなものです。さまざまな情報源を読むと、多くの人がさまざまな提案を推奨しますが、ほとんどの場合、xqueryで解決されます。ここにいくつかのリンクがあります。

http://www.w3.org/XML/Query/

http://www.w3.org/TR/xquery-update-10-use-cases/

http://www.w3.org/TR/xquery-update-10/

于 2012-04-21T06:25:23.423 に答える