2

以下のようなXMLがあります。

<d2p1:Application> 
 <d2p1:Identifier>0001482022534</d2p1:Identifier> 
 <d2p1:Channel>Web</d2p1:Channel> 
 <d2p1:Type>Change</d2p1:Type> 
 <d2p1:Status>Received</d2p1:Status> 
 <d2p1:Value>Received</d2p1:Value> 
 <d2p1:FilterList> 
  <d2p1:Filter>Channel</d2p1:Filter> 
  <d2p1:Filter>Type</d2p1:Filter> 
  <d2p1:Filter>Value</d2p1:Filter> 
 </d2p1:FilterList> 
</d2p1:Application>

望ましい出力:

<d2p1:Application> 
 <d2p1:Channel>Web</d2p1:Channel> 
 <d2p1:Type>Change</d2p1:Type> 
 <d2p1:Value>Received</d2p1:Value> 
</d2p1:Application>

私の希望する出力は、XML から要素を削除する<FilterList>.ことです。これには、XSLT が必要です。フィルタ リストの値は動的です。誰でもこれを手伝ってもらえますか。

4

2 に答える 2

2

1つの方法は、キーを使用して「フィルター」値を検索することです。

<xsl:key name="Filter" match="d2p1:Filter" use="." />

次に、XSLT Identity Transformを拡張して、キーが何も返さない要素に一致するテンプレートを含めることができます。

<xsl:template match="d2p1:Application/*[not(key('Filter', local-name()))]" />

これが完全なXSLTです

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d2p1="d2p1">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="Filter" match="d2p1:Filter" use="." />

   <xsl:template match="d2p1:Application/*[not(key('Filter', local-name()))]" />

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

サンプルXMLに適用すると(プレフィックスd2p1の名前空間宣言が含まれていると仮定)、次のように出力されます。

<d2p1:Application xmlns:d2p1="d2p1">
   <d2p1:Channel>Web</d2p1:Channel>
   <d2p1:Type>Change</d2p1:Type>
   <d2p1:Value>Received</d2p1:Value>
</d2p1:Application>

それに応じて名前空間を変更する必要があることに注意してください。

于 2012-12-20T15:39:23.420 に答える
0

ID テンプレートを使用してすべてをコピーし、削除したいものをオーバーライドするという通常のアプローチを使用している場合、問題は、削除したいものを特定する方法になります。どうですか

<!-- NB - fix the xmlns:d2p1 to match the document -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:d2p1="urn:d2p1">

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

  <xsl:template match="d2p1:Application/*[
      not(local-name() = ../d2p1:FilterList/d2p1:Filter)]" />
</xsl:stylesheet>

これにより、同じ要素の FilterListd2p1:Applicationに含まれるフィルターのいずれにも名前が一致しないの子が削除されます (がない場合は、要素自体も含まれます)。d2p1:Applicationd2p1:FilterList<d2p1:Filter>FilterList</d2p1:Filter>

これは、ドキュメントに複数のd2p1:Application要素があり、それぞれが独自に制御されている場合でも機能しますFilterList(名前空間宣言がないことから、提供した XML は完全な例ではなくドキュメントの断片であると推測されます)。

于 2012-12-20T16:36:43.617 に答える