仅复制名称中包含“a”的节点

时间:2015-06-17 18:22:07

标签: xml xslt-1.0

我有一个基本上这样读的阴影:

我有这个XMl结构

<?xml-stylesheet href="monfichier.xsl" type="text/xsl" ?>
<a>
<ab x="x"><b>Test</b><a>z</a></ab>
<z x="x"><a>z</a></z>
</a>

我需要复制名称中包含“a”的所有节点,但父节点中还包含“a”。在我的例子中,这意味着跳过节点

 <z x="x"><a>z</a></z> 

由于父母的名字包含“z”而不是“a”。这是我的输出应该是什么样的。

<a>
<ab x="x"><a>z</a></ab>

这个分配是两部分,第一部分是编写不使用xsl:element的XSLT代码,第二部分是不使用xsl:copy的。我还在第一部分,所以xsl:copy是可以的。

这是我想出来的,环顾互联网。

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//*[contains(name(), 'a')]">
  <xsl:copy>
    <xsl:apply-templates />
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>   

问题是这段代码不会忽略节点......我似乎无法理解这一点。

谢谢

修改

使用Potame的anwser,我能够弄清楚任务的第二部分,即在没有任何xsl:copy的情况下做同样的事情。

这是代码,它就像一个魅力。

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*[contains(name(), 'a')]/*[contains(name(), 'a')] | /*[contains(name(), 'a')]">
     <xsl:element name="{local-name()}">
       <xsl:choose>
         <xsl:when test="@x">
           <xsl:attribute name="x" >
             <xsl:value-of select="@x" />
           </xsl:attribute>
         </xsl:when>
       </xsl:choose>
       <xsl:apply-templates />
     </xsl:element>
  </xsl:template>
  <xsl:template match="*" >
  </xsl:template>
</xsl:stylesheet>   

1 个答案:

答案 0 :(得分:1)

这是一个小样式表,可以引导您达到预期效果。

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="*[contains(name(), 'a')]/*[contains(name(), 'a')] | /*[contains(name(), 'a')]">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*">
  </xsl:template>

</xsl:stylesheet>

但是,我认为对于必须跳过的元素中的文本情况,并没有明确说明。

Morover,我们应该如何处理这样的案件:

<a>
  <z x="x">
    <aa>z
      <ade>Another case</ade>
    </aa>
  </z>
</a>

<z>将被跳过,但我们应该对他的内容做什么?关于您的规则,应输出<ade>,因为它是<aa>的孩子,但<aa>完全没有处理,因为其父级为z(已跳过)。