仅复制名称包含"a"的节点



我有一个基本上是这样的:

我有这个 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>   

这是一个小样式表,将引导您获得预期的结果。

<?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>

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

莫洛弗,我们应该如何处理这样的情况:

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

<z>是要跳过的,但我们是否应该对他的内容做?关于您的规则,应该输出<ade>,因为它是 <aa> 的子项,但<aa>根本不处理,因为它的父级是z(跳过)。

相关内容

  • 没有找到相关文章

最新更新