2014-06-11 65 views
1

我有索姆XML我需要转换以删除双标签。xsl转换删除双标签

原来我用:

<xsl:template match="*[name()=name(../..)]"></xsl:template> 
<xsl:template match="*[name()=name(../../..)]"></xsl:template> 
<xsl:template match="*[name()=name(..)]"> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:template> 

一起除去内部的两个标签名称相同。但是,如果只有一个内部标签,那只能工作得很好。

我:

<a> 
<a> 
    <b>xxxx</b> 
    <c>xxxx</c> 
</a> 
<a> 
    <b>yyyy</b> 
    <c>yyyy</c> 
</a> 
</a> 

我想结束了:

<a> 
    <b>xxxx</b> 
    <c>xxxx</c> 
</a> 
<a> 
    <b>yyyy</b> 
    <c>yyyy</c> 
</a> 

不是:

<a> 
    <b>xxxx</b> 
    <c>xxxx</c> 
    <b>yyyy</b> 
    <c>yyyy</c> 
</a> 

我还不是很了解XSL转换与搜索语法,所以我希望有人能帮助我。

+0

您要求的输出不是格式良好的XML(缺少根元素)。你确定这就是你想要的吗? –

回答

2

以下样式表将删除(父)元件,其孩子们都具有相同的名称:

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="*"/> 

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

<!-- exception for parent whose children have all the same name --> 
<xsl:template match="*[*][not(*[name()!=name(..)])]"> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:template> 

</xsl:stylesheet> 

当上述被施加到下面的测试输入:

<root> 
    <a> 
     <a> 
      <b>bbb</b> 
      <c>ccc</c> 
     </a> 
     <a> 
      <d> 
       <d>ddd</d>  
      </d> 
      <e>eee</e> 
      <f> 
       <f>fff</f> 
       <g>ggg</g> 
      </f> 
     </a> 
    </a> 
</root> 

结果将会是:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <a> 
     <b>bbb</b> 
     <c>ccc</c> 
    </a> 
    <a> 
     <d>ddd</d> 
     <e>eee</e> 
     <f> 
     <f>fff</f> 
     <g>ggg</g> 
     </f> 
    </a> 
</root> 
1

而不是在它的名字听起来像你真的要删除的时,它的名字是一样的所有子女的父或母,匹配消除孩子:

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

<xsl:template match="*[*][not(*[name() != name(..)])]"> 
    <xsl:apply-templates select="@*|node()" /> 
</xsl:template> 

可以读取第二匹配表达式为“任何具有至少一个子元素的元素X,也没有任何具有不同于X的名称的子元素”。

+0

您也正在消除叶元素。 –

+0

看起来像一些正确的东西。出于某种原因,除了第一个包含数据的最内层标签之外的所有内容都被删除(除了它们的数据,它现在是内部标签内的一个长字符串。) 我也在做其他一些转换,所以可能有些东西有... – user3036309

+0

@ michael.hor257k真的,我已经编辑过现在限制该模板只有非叶元素 –