2016-07-28 88 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重命名。 –