2017-12-16 12 views
-1

あなたは皆がうまくやっていると思います!!要素を検索して対処する

私は、次の操作を実行する必要があるシナリオを持っている:

私は以下のようにXMLの小枝のコンテンツを持っています。

`<?xml version="1.0" encoding="UTF-8" ?> 
<a> 
    <b> 
     <c> 
      <key>One</key> 
      <value>Value1</value> 
     </c> 
     <c> 
      <key>Two</key> 
      <value>Value2</value> 
     </c> 
     <c> 
      <key>Three</key> 
      <value>Value3</value> 
     </c> 
     <c> 
      <key>Four</key> 
      <value>Value4</value> 
     </c> 
     <c> 
      <key>Five</key> 
      <value>Value5</value> 
     </c> 
    </b> 
    <d> 
     <e> 
      <Five>Check this feild</Five> 
      <Seven>It is extra</Seven> 
      <tewnty>extra</tewnty> 
     </e> 
     <f> 
      <Three>it is present</Three> 
      <Five>Came again</Five> 
     </f> 
     <g> 
      <Four>It is here</Four> 
     </g> 
    </d> 
    <n> 
     <Five>Dont check under n</Five> 
     <Six>Extra under n</Six> 
     <Three>Dont check under n</Three> 
    </n> 
</a>` 

は、今私は/a/b/c/key/text()は、要素名 /a/d

trueの場合として存在するならば、現在のキー/値のペアをコピーし、チェックしたいです。 出力するこのキーと値のペアを無視しない場合。

だから私の出力は次のようになります。

`<?xml version="1.0" encoding="UTF-8" ?> 
<a> 
    <b> 
     <c> 
      <key>Three</key> 
      <value>Value3</value> 
     </c> 
     <c> 
      <key>Four</key> 
      <value>Value4</value> 
     </c> 
     <c> 
      <key>Five</key> 
      <value>Value5</value> 
     </c> 
    </b> 
    <d> 
     <e> 
      <Five>Check this feild</Five> 
      <Seven>It is extra</Seven> 
      <tewnty>extra</tewnty> 
     </e> 
     <f> 
      <Three>it is present</Three> 
      <Five>Came again</Five> 
     </f> 
     <g> 
      <Four>It is here</Four> 
     </g> 
    </d> 
    <n> 
     <Five>Dont check under n</Five> 
     <Six>Extra under n</Six> 
     <Three>Dont check under n</Three> 
    </n> 
</a>` 

あなたはXSLTで私を助けてください。

ノードのlocal-name()とifでチェックしていました。

XSLTでどうすれば実現できますか?

私の質問によれば、要素名=(c/key/text())に基づいてノードを削除するにはどうすればいいですか?

私の質問が具体的であることを願っています。

おかげ&よろしく Chandruは

+1

[**なぜ「誰かが私を助けることはできますか?」ではない、実際の質問?**]をお読みください(https://meta.stackoverflow.com/q/284236/290085)用 – kjhughes

答えて

1

次のスタイルシートは、彼らのlocal-name()を使用して/a/d/*/*下の要素のxsl:keyを使用して、基準だ/a/b/*下の要素を除外するようtext()値はxsl:keyで任意の項目を見つけていないことを使用しています。

これは変更されたidentity transformationであり、デフォルト処理はすべてを保持することです。 xsl:keyを使用する2番目の空のテンプレートと一致する要素は、それらの要素が確実に削除されます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="UTF-8" /> 

    <xsl:key name="filter" match="https://stackoverflow.com/a/d/*/*" use="local-name()"/> 

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

    <xsl:template match="https://stackoverflow.com/a/b/c[not(key('filter', key/text()))]"/> 

</xsl:stylesheet> 
+0

おかげでマッズを応答。私はこれを試した。入力として出力を生成しています。 – user2071463

+1

@ user2071463、http://xsltfiddle.liberty-development.net/jyyiVhe(XSLT 3バージョン)とhttp://xsltfiddle.liberty-development.net/jyyiVhe/1(XSLT 2バージョン)では、Madsのアプローチキーの仕事と一緒に。 –

関連する問題