1

次の構造を前提として、XPATHでツリー全体を選択したいのですが、最初の日付のみを含めて、他のすべての日付を除外します。最初の日付以降の日付の数は一定ではありません。何か案は?申し訳ありませんが、形式が正しくありません。

<A>
    <B>
        <DATE>04272011</DATE>
        <C>
           <D>
                <DATE>02022011</DATE>
           </D>
           <D>
                <DATE>03142011</DATE>
           </D>
        </C>
    </B>
</A>

申し訳ありません。

より良い例

<NOTICES>

<SNOTE>

    <DATE>01272011</DATE>
    <ZIP>35807</ZIP>
    <CLASSCOD>A</CLASSCOD>
    <EMAIL>
        <ADDRESS>address 1</ADDRESS>
    </EMAIL>
    <CHANGES>
        <MOD>
            <DATE>02022011</DATE>
            <MODNUM>12345</MODNUM>
            <EMAIL>
                <ADDRESS>address 2</ADDRESS>
            </EMAIL>
        </MOD>
        <MOD>
            <DATE>03022011</DATE>
            <MODNUM>56789</MODNUM>
            <EMAIL>
                <ADDRESS>address 3</ADDRESS>
            </EMAIL>
        </MOD>
    </CHANGES>
</SNOTE>

</NOTICES>

1つの大きなxmlファイルを個々のXMLファイルに分割しています。私の元のXPATHステートメントは

/ NOTICES / SNOTE

個々のxmlファイルは、すべての日付を取得することを除いて、問題なく表示されます。これが私の目的の出力です。

<SNOTE>

<DATE>01272011</DATE>
<ZIP>35807</ZIP>
<CLASSCOD>A</CLASSCOD>
<EMAIL>
    <ADDRESS>address 1</ADDRESS>
</EMAIL>
<CHANGES>
    <MOD>
        <MODNUM>12345</MODNUM>
        <EMAIL>
            <ADDRESS>address 2</ADDRESS>
        </EMAIL>
    </MOD>
    <MOD>
        <MODNUM>56789</MODNUM>
        <EMAIL>
            <ADDRESS>address 3</ADDRESS>
        </EMAIL>
    </MOD>
</CHANGES>

</SNOTE>

4

2 に答える 2

3

XPath は XML ドキュメントのクエリ言語であるため、ドキュメントの構造を変更することはできません (ノードの挿入/削除/名前変更など)。

必要なのは XSLT 変換です。次のように簡単です。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="DATE[preceding::DATE]"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<A>
    <B>
        <DATE>04272011</DATE>
        <C>
            <D>
                <DATE>02022011</DATE>
            </D>
            <D>
                <DATE>03142011</DATE>
            </D>
        </C>
    </B>
</A>

必要な正しい結果が生成されます。

<A>
   <B>
      <DATE>04272011</DATE>
      <C>
         <D/>
         <D/>
      </C>
   </B>
</A>
于 2012-09-27T16:09:41.623 に答える
1

「ツリー全体を選択する」とは、「ツリー内のすべてのノードのセットを選択する」ことを意味する場合 (最初以外の DATE 要素を除く)、次のように実行できます。

"//node()[not(self::DATE) or not(preceding::DATE)]"

次に、最初の<DATE>要素以外のノード自体は選択したノードセットに含まれませんが、選択したノードセットのノード (ルート ノードや など<D>) には引き続き<DATE>子孫があります。

代わりに、ツリー (つまり、ルート ノード) を選択するか、<D>要素が子を持たないように変更したバージョンを選択する場合<DATE>は、ツリーを変更する必要があります。XPath だけでは XML ツリーを変更できません。XSLT や XML DOM ライブラリなどの XML 変換テクノロジが必要です。

于 2012-09-27T16:06:29.513 に答える