我有一个基本上这样读的阴影:
我有这个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>
答案 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
(已跳过)。