1

特定の子要素の特定の親要素を取得する C# スクリプトの作成に問題があります。わかりやすくするために、これは XML ツリーの例です。

<parent attribute='X'>
  <child_element1>A</child_element1>
  <child_element2 attribute='Y'>
    <grandchild_element1>B</grandchild_element1>
    <grandchild_element2>
      <key>C</key>
    </grandchild_element2>
    <grandchild_element3>D</grandchild_element3>
  </child_element2>
  <child_element3>E</child_element3>
</parent>  

ツリーをトラバースすると、スクリプトは<key>ノードを見つけました。私が作成しようとしているのは、次のツリーです。

<parent attribute='X'>
  <child_element2 attribute='Y'>
    <grandchild_element1>B</grandchild_element1>
    <grandchild_element2>
      <key>C</key>
    </grandchild_element2>
    <grandchild_element3>D</grandchild_element3>
  </child_element2>
</parent>  

ご覧のとおり、元のツリーで削除しようchild_element1としています。child_element3

次のようにスクリプトの疑似コードを作成しましたが、これまでのところ、C# で実際のスクリプトを作成する方法を理解できていません。

  1. キー ノードの上にある 1 番目と 2 番目の親要素をすべて表示します。grandchild_element2key の最初の親であり、key のchild_element22 番目の親です。したがって、すべての要素が表示されます。
  2. 次の親レベルのキーと直接関係があるノード/要素のみを表示します。parentキーの 3 番目の親です。parentkey と直接関係のある要素は ですchild_element2。したがって、のみchild_element2が表示されます。child_Element1これらはキーとchild_element2直接関係がないため表示されません

<key>私はstackoverflowで次の解決策を見てきましたが、残念ながら、それらはすべて、ノードの祖先である要素を表示するのではなく、すべての親要素を取得する方法のみを示しています.

  1. 子ノードが特定の基準を満たしている場合、XML 親ノード属性を取得し、両方を変数に割り当てます。
  2. C# XML、ノードとそのすべての親を見つける
4

1 に答える 1

1

XSLT を使用する場合、これは非常に簡単です。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:param name="valueToFind" select="'C'" omit-xml-declaration="yes" />

  <xsl:template match="/*">
    <xsl:apply-templates select="node()[descendant-or-self::node() = $valueToFind]" />
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates 
            select="node()[descendant-or-self::node() = $valueToFind]" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

XML の例に単一のルート要素が与えられ、この XSLT にフィードされると、結果は次のようになります。

<a>
  <a.1 name="First">
    <a.1.2>
      <a.1.2.2>
        <key>C</key>
      </a.1.2.2>
    </a.1.2>
  </a.1>
</a>

XSLT に慣れていない場合は、XSLT パラメータ:

<xsl:param name="valueToFind" select="'C'" />

基本的に、実行中のコードから値を渡すことができる変数です。ここでは、デフォルト値Cを指定したので、XSLT デバッガーで実行して実証可能な結果を​​生成できます。

于 2013-01-29T11:08:07.550 に答える