2017-05-26 1 views
1

XMLを整理することを任されていますので、やや緩やかなDTDにもかかわらず、すべて同じ方法で宣言されています。例えば、XSLTが存在する場合、その要素を移動するにはどうすればいいですか?

<all> 
<e> 
    <hg> 
     <hw>things</hw> 
     <posg><pos value="abc" /></posg> 
    </hg> 
    <sg><se1 /></sg> 
</e> 
<e> 
    <hg> 
     <hw>stuff</hw> 
     <posg><pos value="def" /></posg> 
    </hg> 
    <sg> 
     <se1> 
      <posg><pos value="ghi" /></posg> 
     </se1> 
    </sg> 
</e> 
</all> 

以下の要素に<posg>要素が<se1>なく<hg>の子でなければなりません。さらに、<se1>要素に<posg>要素がすでに存在する場合は、の最初の子要素として新しい<se1>要素を作成し、次に要素を<hg>要素から新しい<se1>要素に移動する必要があります。

効果で、その後、上記の2つの要素は、私が不正<posg>要素が<hg>内に存在するかどうかを確認してから、上記の適切な行動をとる方法で苦労されている

<all> 
    <e> 
     <hg> 
      <hw>things</hw> 
     </hg> 
     <sg> 
      <se1> 
       <posg><pos value="abc" /></posg> 
      </se1> 
     </sg> 
    </e> 
    <e> 
     <hg> 
      <hw>stuff</hw> 
     </hg> 
     <sg> 
      <se1> 
       <posg><pos value="def" /></posg> 
      </se1> 
      <se1> 
       <posg><pos value="ghi" /></posg> 
      </se1> 

     </sg> 
    </e> 
</all> 

変換した後、次のようになります。

答えて

2

は、次のスクリプトを使用します。

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="sg"> 
    <xsl:copy> 
     <xsl:if test="../hg/posg"> 
     <se1><xsl:copy-of select="../hg/posg"/></se1> 
     </xsl:if> 
     <xsl:if test="se1/posg"> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:if> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="hg/posg"/> 

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

このソリューションは、それがHGの要素から全体にコピーする一切posgがない場合でも、SGに余分SE1の子に追加することを除いて動作します。そのようなことをやめたり、生成された空のse1要素を削除するにはどうすればいいですか? – Hmobius

+1

問題ありません。私は 'を' ' と' '(スクリプトを見てください)でラップしました。したがって、 ''タグは、内部に何かがある場合にのみ生成されます。 –

関連する問題