2011-10-19 10 views
1

XSLTを使用して複数の文書を一度に変換します。これらの文書は、 <a:updated></a:updated>または<app:edited></app:edited>のような要素を持ち、そのうちのいくつかは<a:updated></a:updated><app:edited></app:edited>の両方を持つことがあります。2つの同じ要素が見つかった場合、変換時に1つの要素を削除します。

この場合、出力されたドキュメントの一部(title、link、contentなどの標準要素に加えて)には、<posted></posted>という要素が2回あります。

ここに質問がある場合<posted></posted><app:edited><a:updated>が同じ<entry></entry>に見つかった場合はどうすれば削除できますか?

これはこれは、テンプレート

<xsl:template match="a:updated | app:edited"> 
    <posted>  
    <xsl:apply-templates select="node() | @*" /> 
    </posted> 
</xsl:template> 

である、これは私が

$xproc = new XsltProcessor(); 
$xslt = new DomDocument; 
$xslt->load('stylesheet.xslt'); 
$xproc->importStylesheet($xslt); 

それを処理する方法であり、これは基本的にXML

あるXSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app"> 

の見出しです

<entry> 
<id></id> 
<title></title> 
<content></content> 
<link></link> 
<a:updated></a:updated> 
<app:edited></app:edited> 
</entry> 
+0

+1、しかし、私たちにXMLを表示してください:電子出力)を生産しています。一般に、どのようにテンプレートを選択するかは、実行するためにどのように選択されるかは、このテンプレートを選択する ''命令に依存します。したがって、解決策は、 'a:updates'、' updated'、 'app:edited'のいずれかの場合にのみテンプレートを適用することです。 –

答えて

0

正解は、表示されていないソースXML文書によって異なります。

一般的に、すべてのテンプレートが実行のために選択された時に、このテンプレートを選択し<xsl:apply-templates>命令に依存するため、このような何かしようとするかどうか、どのように:

<xsl:apply-templates select= 
    "(//* 
    [self::a:updated 
    or 
     self::updated 
    or self::app:edited 
    ]) 
     [1] 
"/> 

可能な場合に、//擬似を代用してみてくださいオペレータは、より具体的なXPath式を使用します。なぜなら、//は非効率的な性質を持つためです。

更新:今OPは、XML文書を掲載していることを、ここでより具体的なソリューションです。この変換が提供されるXML文書に適用されると

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

<xsl:template match="/"> 
    <xsl:apply-templates select= 
     "(/*/* 
     [self::a:updated 
     or 
      self::updated 
     or self::app:edited 
     ]) 
      [1] 
    "/> 
</xsl:template> 

<xsl:template match="a:updated | app:edited"> 
     <posted> 
     <xsl:apply-templates select="node() | @*" /> 
     </posted> 
</xsl:template> 
</xsl:stylesheet> 

(よく作られたことにマッサージ-formed):

<entry xmlns:a="a" xmlns:app="app"> 
    <id></id> 
    <title></title> 
    <content></content> 
    <link></link> 
    <a:updated></a:updated> 
    <app:edited></app:edited> 
</entry> 

たかっ正しい結果<posted>は目に1回だけ発生します良い質問の

<posted/> 
+0

ありがとうございました。私はそれを試みたが、私にXSLTプロセッサのエラーを与えた。しかし、更新された質問でわかるように、私は3つの要素のうちの1つを削除しました。 XML文書も投稿しました。 – JohnQ

+0

@ JohnQ:完全な変換については、私の更新された答えを見てください。ちょうどコピー・ペースト・ランします。 –