我有一个基本上是这样的:
我有这个 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
(跳过)。