2016-07-28 13 views
0

"単数形"という名前のタグの配列を囲む "複数"という名前のタグを持つ以下のようなxmlがあります。例:marketHierarchyLevels & marketHierarchyLevel、archiveLevels & archiveLevel。xsltを使用して特定のタグを削除する

xsltを使用してこれらのパターンを識別し、 "複数"タグを削除したいと考えています。これはXSLT経由で可能ですか?

入力

<customer> 
     <marketReference> 
      <marketHierarchyLevels> 
       <marketHierarchyLevel> 
        <marketName>NATIONAL</marketName> 
        <level>0</level> 
        <marketId>1</marketId> 
       </marketHierarchyLevel> 
       <marketHierarchyLevel> 
        <marketName>WEST DIVISION</marketName> 
        <level>1</level> 
        <marketId>8211</marketId> 
       </marketHierarchyLevel> 
      </marketHierarchyLevels> 
     </marketReference> 
     <archiveReference> 
      <archiveLevels> 
       <archiveLevel> 
        <marketName>NATIONAL</marketName> 
        <level>0</level> 
        <marketId>1</marketId> 
       </archiveLevel> 
       <archiveLevel> 
        <marketName>WEST DIVISION</marketName> 
        <level>1</level> 
        <marketId>8211</marketId> 
       </archiveLevel> 
      </archiveLevels> 
     </archiveReference>     
    </customer> 

予想される出力

 <customer> 
      <marketReference> 

        <marketHierarchyLevels> 
         <marketName>NATIONAL</marketName> 
         <level>0</level> 
         <marketId>1</marketId> 
        </marketHierarchyLevels> 
        <marketHierarchyLevels> 
         <marketName>WEST DIVISION</marketName> 
         <level>1</level> 
         <marketId>8211</marketId> 
        </marketHierarchyLevels> 

      </marketReference> 
      <archiveReference> 

        <archiveLevels> 
         <marketName>NATIONAL</marketName> 
         <level>0</level> 
         <marketId>1</marketId> 
        </archiveLevels> 
        <archiveLevels> 
         <marketName>WEST DIVISION</marketName> 
         <level>1</level> 
         <marketId>8211</marketId> 
        </archiveLevels> 

      </archiveReference>     
     </customer> 

最新のXSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:m="http://xml.comcast.com/saleschannelmanagement/services" 
    xmlns:typ="http://xml.comcast.com/saleschannelmanagement/types"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="*[name() = concat(name(*), 's')]"> 
    <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="*[concat(name(), 's') = name(..)]"> 
     <xsl:element name="{name()}s"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 





</xsl:stylesheet> 

答えて

1

- 変更要求に応じて編集した - 個人的に

XSLT 1.0

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

<xsl:template match="*"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[name() = concat(name(*), 's')]"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="*[concat(name(), 's') = name(..)]"> 
    <xsl:element name="{name()}s"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

、私はより安全なアプローチを好むだろう - 構造を知っているあなたを必要とするものとはいえ受信XMLの:

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

<xsl:template match="*"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="marketHierarchyLevels | archiveLevels"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="marketHierarchyLevel | archiveLevel"> 
    <xsl:element name="{name()}s"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

マイケルありがとうございます。私はこれをチェックします。 –

+0

@PunterVicky再読みに、私はあなたの質問に誤解している可能性があります。上記では、名前が "s"で終わるラッパー要素がすべて削除されます。あなたは、名前が子どもの複数形である要素にこれを限定することを意味しましたか?もしそうなら、 ''を ''これは、最初の子の名前だけを調べることに注意してください。 –

+0

ありがとうマイク。はい、sを除いてまったく同じものを持つ親子要素にのみ制限したいと思います。親はsを持ち、子はsを持たないはずです。申し訳ありませんが、私はそれを見落としたので、私は予想された出力を少し変更しました。すべての子要素は、親要素の削除後にsで名前を変更する必要があります。 –

関連する問題