2016-07-28 106 views
0

我有一個類似於下面的xml,其中有一個以「plural」命名的標記,其中包含一個以「singular」命名的標記數組。例如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

非常感謝Michael。我會檢查一下。 –

+0

@PunterVicky重讀後,我可能誤解了你的問題。以上將刪除*名稱以「s」結尾的任何*包裝元素。你是不是想限制這個名字是他們孩子的複數形式的元素?如果是的話,你應該把''改成''注意這隻看第一個孩子的名字。 –

+0

謝謝邁克。是的,我只想限制它只包含除s之外完全相同的父子元素。家長應該有孩子,不應該有孩子。對不起,我現在稍微修改了我的預期輸出,因爲我忽略了它。刪除父元素後,所有子元素都必須用s重命名。 –